Dee*_*ace 9 python unicode flask python-requests flask-restful
我已经在SO上阅读了几个相关的问题,但没有设法找到一个有效的解决方案.
我有一个带有这个简化代码的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)
Run Code Online (Sandbox Code Playgroud)
然后在客户端:
# 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')})
Run Code Online (Sandbox Code Playgroud)
当发送带有非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
Run Code Online (Sandbox Code Playgroud)
总结一下,我不完全确定问题是否在于requests没有正确地将文件附加到请求,或者是否Flask存在拾取具有根据RFC2231编码的文件名的文件的问题.
更新:在requestsGitHub中遇到过这个问题:https://github.com/kennethreitz/requests/issues/2505
我通过手动读取文件read()然后发布其内容来解决此问题:
requests.post(upload_url, files={
'file': ("photo.jpg", open(path_with_unicode_filename, 'rb').read())
})
Run Code Online (Sandbox Code Playgroud)