Python requests 处理 UTF-8 文件名时出错

5 投票
1 回答
1055 浏览
提问于 2025-04-18 01:15

我正在尝试使用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 是在做“正确”的事情(根据标准),但如果服务器上的某个组件不遵循标准,它也无能为力(或者问题可能不在服务器上,比如可能有一个代理在你通过的过程中造成了这个问题)。

撰写回答