首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python-带有unicode文件名的请求发布

python-带有unicode文件名的请求发布
EN

Stack Overflow用户
提问于 2015-11-15 08:12:06
回答 3查看 3.4K关注 0票数 10

我在这里读过几个相关的问题,但没有找到一个可行的解决方案。

我有一个具有以下简化代码的Flask服务器:

代码语言:javascript
复制
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)

然后在客户端:

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
--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中发现了这个问题

EN

回答 3

Stack Overflow用户

发布于 2016-02-04 12:32:25

我想这里的编码可能有点混乱-

代码语言:javascript
复制
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

要将第二个服务器发送到服务器,您要做的是:

代码语言:javascript
复制
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name.encode('utf-8'), 'rb')})

我有点惊讶,因为它没有向试图打开文件的客户端抛出一个错误--在客户端没有看到任何指示错误的东西吗?

编辑:确认或否定我的想法的一个简单方法当然是从客户端内部打印出内容,以确保内容被正确读取。

票数 2
EN

Stack Overflow用户

发布于 2016-02-04 12:19:39

通过使用read()手动读取文件,然后发布其内容,我解决了这个问题:

代码语言:javascript
复制
requests.post(upload_url, files={
    'file': ("photo.jpg", open(path_with_unicode_filename, 'rb').read())
})
票数 1
EN

Stack Overflow用户

发布于 2020-09-23 15:05:05

试试这个解决办法:filename.encode("utf-8").decode("iso-8859-1")

示例:

代码语言:javascript
复制
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标准。似乎不同的程序实现了这个部分的不同。

stackoverflow:大量的RFCs和应用程序测试RFC 2231 -4rfc2231

Java版本答案在这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33717690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档