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

时间:2014-04-03 22:34:13

标签: python python-requests python-unicode

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

答案 0 :(得分:2)

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

它的价值requests正在做什么&#34;正确&#34;事情(根据标准),但如果服务器上的某些组件不遵循标准(或者甚至可能不在服务器上),它也可以做很多事情 - 例如可能存在你正在通过导致问题的代理人。)