簡體   English   中英

處理curl文件上傳請求時,Python HTTP服務器中的KeyError

[英]KeyError in Python HTTP server when handling curl file upload requests

我在Python中有一個HTTP服務器,用於處理來自curl的文件上傳請求

class HTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
            if re.search('/api/v1/addphoto', self.path):
                    form_data=cgi.FieldStorage()
                    file_data=form_data['photofile'].value 
                    # Next I will save this file 
                    # fp =open('some/file','wb')
                    # fp.write(file_data)
                    # fp.close()

現在我必須使用curl來發送請求,命令是

curl -i -F name=photofile -F filedata=@01.jpeg http://server_ip:port/api/v1/addphoto

但是服務器報告錯誤

File "./apiserver.py", line 21, in do_POST
    file_data=form_data['photofile'].value
File "/usr/lib/python2.7/cgi.py", line 541, in __getitem__
    raise KeyError, key
KeyError: 'photofile'

這里有什么問題?

在字典中找不到鍵時引發KeyError

我對cgi.FieldStorage不熟悉,但是我想您應該得到字典,而鍵'photofile'丟失了。 只需打印整個form_data並查看其內容即可。

您可以使用form_data.get('photofile', '')獲得默認值並避免異常。

順便說一句,要寫入文件,您可以將with語句用作上下文管理器。

with open('some/file','wb') as fp:
    fp.write(file_data)

好的,我從這里找到原因以及如何做。

原因是“您不能像這樣將CGI代碼嵌入服務器代碼中。CGIHTTPServer(通常是CGI)的全部要點是,它在指定的目錄中執行單獨的腳本並返回輸出。 因為您已經覆蓋了do_POST方法中,從未調用過解析表單數據的代碼 。” (實際上,我打印了form_data,它是空的-“ None, None, [] ”)。

要解決此問題,請使用傳入的參數( 詳細信息

 form = cgi.FieldStorage(
        fp=self.rfile, 
        headers=self.headers,
        environ={'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE':self.headers['Content-Type'],
                 })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM