0

我在 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'

这里有什么问题?

4

2 回答 2

1

KeyError在字典中找不到键时引发。

我对 cgi.FieldStorage 不熟悉,但我猜你应该得到一本字典,但钥匙'photofile'不见了。只需打印整个 form_data 并查看其内容。

您可以使用form_data.get('photofile', '')获取默认值并避免异常。

顺便说一句,要写入文件,您可以使用with语句作为上下文管理器。

with open('some/file','wb') as fp:
    fp.write(file_data)
于 2014-09-02T16:27:27.817 回答
0

好的,我从这里找到了原因和方法。

原因是“你不能像那样将 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'],
                 })
于 2014-09-03T02:14:02.707 回答