我已经在这里阅读了几个相关的问题,但没有找到可行的解决方案。
我有一个 Flask 服务器,其中包含以下简化代码:
app = Flask(__name__)
api = Api(app)
class SendMailAPI(Resource):
def post(self):
print request.files
return Response(status=200)
api.add_resource(SendMailAPI, '/')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
然后在客户端:
# coding:utf-8
import requests
eng_file_name = 'a.txt'
heb_file_name = u'א.txt'
requests.post('http://localhost:5000/', files={'file0': open(eng_file_name, 'rb')})
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name, 'rb')})
当使用非 utf-8 文件名发送第一个请求时,服务器接收带有文件的请求并打印ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)])
,但是当发送带有 utf-8 文件名的文件时,服务器似乎没有收到打印的文件ImmutableMultiDict([])
.
我正在使用请求2.3.0
但最新版本也没有解决问题(2.8.1
),Flask版本是0.10.1
Flask-RESTful 版本是0.3.4
.
我已经做了一些挖掘requests
代码和请求似乎发送正常(即与文件一起),我在发送请求之前打印了请求,并看到文件名确实被编码为 RFC2231:
--6ea257530b254861b71626f10a801726
Content-Disposition: form-data; name="file0"; filename*=utf-8''%D7%90.txt
总而言之,我不完全确定问题是否出在内部requests
没有正确地将文件附加到请求或者如果Flask
拾取文件名根据 RFC2231 编码的文件时遇到问题。
UPDATE:遇到这个问题requests
GitHub:https://github.com/kennethreitz/requests/issues/2505 https://github.com/kennethreitz/requests/issues/2505