Python在UTF-8文件名上请求chokes

我正在尝试上传文件,使用
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://...

最佳答案 这意味着特定服务器中的某些内容未正确实现Content-Disposition的解析(根据
RFC 5987).我不能比那更具体,因为Web应用程序服务器有许多“移动部件”(例如,你可能使用的是nginx fastcgi PHP),其中任何一个(或所有:)都可能被破坏.你可能会发现
this SO thread以及
this page很有用,它从另一方面解决问题(下载带有UTF-8名称的文件),但归结为同样的问题(解析“Content-Disposition”标题).

对于值得请求的是做“正确”的事情(根据标准),但如果服务器上的某些组件不遵循标准(或者甚至可能不在服务器 – 例如,可能有一个代理你正在通过导致问题的代理).

点赞