我在这里读过几个相关的问题,但没有找到一个可行的解决方案。
我有一个具有以下简化代码的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)也没有解决这个问题,2.8.1版本是0.10.1,而0.3.4版本是0.3.4。
我在requests代码中做了一些调查,请求似乎被发送到了ok (即与文件一起发送),并且在发送请求之前就打印了它,并且看到文件名确实被编码到RFC2231:
--6ea257530b254861b71626f10a801726
Content-Disposition: form-data; name="file0"; filename*=utf-8''%D7%90.txt总之,我不完全确定问题是在requests中,它没有正确地将文件附加到请求,或者Flask在使用根据RFC2231编码的文件名时是否有问题。
更新:在requests GitHub:https://github.com/kennethreitz/requests/issues/2505中发现了这个问题
发布于 2016-02-04 12:32:25
我想这里的编码可能有点混乱-
eng_file_name = 'a.txt' # ASCII encoded, by default in Python 2
heb_file_name = u'א.txt' # NOT UTF-8 Encoded - just a unicode object要将第二个服务器发送到服务器,您要做的是:
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name.encode('utf-8'), 'rb')})我有点惊讶,因为它没有向试图打开文件的客户端抛出一个错误--在客户端没有看到任何指示错误的东西吗?
编辑:确认或否定我的想法的一个简单方法当然是从客户端内部打印出内容,以确保内容被正确读取。
发布于 2016-02-04 12:19:39
通过使用read()手动读取文件,然后发布其内容,我解决了这个问题:
requests.post(upload_url, files={
'file': ("photo.jpg", open(path_with_unicode_filename, 'rb').read())
})发布于 2020-09-23 15:05:05
试试这个解决办法:filename.encode("utf-8").decode("iso-8859-1")。
示例:
requests.post("https://example.com", files={"file":
("中文filename.txt".encode("utf-8").decode("iso-8859-1"), fobj, mimetype)})我发布这篇文章是因为这是我搜索python requests post filename encoding时的第一个结果。
关于Content-Disposition编码有很多RFC标准。似乎不同的程序实现了这个部分的不同。
https://stackoverflow.com/questions/33717690
复制相似问题