Python requests 处理 UTF-8 文件名时出错
我正在尝试使用requests库来上传一个文件,通过提交一个POST请求。
这个方法运行得很好:
theFile = { 'LUuploadFile': ("linea.ipa", open(path_to_file, 'rb'), 'application/octet-stream') }
request = requests.post(url, files=theFile)
但是这个方法就出错了:
theFile = { 'LUuploadFile': ("línea.ipa", open(path_to_file, 'rb'), 'application/octet-stream') }
request = requests.post(url, files=theFile)
这个错误很奇怪:
( <class 'requests.exceptions.ConnectionError'>,
ConnectionError(MaxRetryError("HTTPSConnectionPool(host='fupload.apperian.com', port=443):
Max retries exceeded with url: /upload?transactionID=...
(Caused by <class 'socket.error'>: [Errno 32] Broken pipe)",),),
<traceback object at 0x100a8e3f8>)
问题不在服务器上,如果我用curl
命令的话,服务器是可以接受文件名的:
curl --form "LUuploadFile=@línea.ipa" http://...
1 个回答
2
这意味着在特定的服务器上,有些东西没有正确处理 Content-Disposition
这个部分(根据 RFC 5987 的规定)。我不能给出更具体的解释,因为一个网络应用服务器有很多“活动部分”(比如你可能在用 nginx + fastcgi + PHP),其中任何一个(或者全部 :)都可能出现问题。你可能会觉得 这个讨论串 和 这个页面 有帮助,它们从另一个角度讨论了这个问题(下载带有 UTF-8 名称的文件),但最终还是和同样的问题有关(解析 "Content-Disposition" 头部)。
值得一提的是,requests
是在做“正确”的事情(根据标准),但如果服务器上的某个组件不遵循标准,它也无能为力(或者问题可能不在服务器上,比如可能有一个代理在你通过的过程中造成了这个问题)。