【问题标题】:Python requests chokes on a UTF-8 filenamePython 请求 UTF-8 文件名阻塞
【发布时间】:2014-04-03 22:34:12
【问题描述】:

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

【问题讨论】:

  • 我猜requests 将 í 字符作为 UTF-8 编码直接放入套接字中,作为 Content-Disposition 标头的一部分,这是不允许的。您是否尝试过对文件名进行百分比编码?
  • @univerio - 实际上,这正是curl 所做的。 requests 编码为filename*=utf-8''li%CC%81nea.ipa (rfc5987),服务器可能不支持...
  • 工作行和不工作行的区别在于工作行是指linea,带有小写的i,而一次不工作的行是línea,带有重音符号在 i 上。差异在我的屏幕上不是很明显。
  • @mata - 你是说curl 使用百分比编码,但requests 没有?
  • @egrunin - 不,恰恰相反,curl 是不编码文件名并将其作为原始 utf8 发送的那个...

标签: python python-requests python-unicode


【解决方案1】:

这意味着特定服务器中的某些内容没有正确实现Content-Disposition 的解析(根据RFC 5987)。我不能比这更具体,因为 Web 应用程序服务器有很多“移动部件”(例如,您可能正在使用 nginx + fastcgi + PHP)并且其中任何一个(或全部:))都可能被破坏。您可能会发现 this SO threadthis page 很有用,它们从另一方面解决了问题(下载具有 UTF-8 名称的文件),但归结为相同的问题(解析“Content-Disposition”标头)。

值得requests 做“正确”的事情(根据标准),但如果服务器上的某些组件不遵循标准(或者它可能甚至不在服务器上 - 例如,您正在通过的代理可能会导致问题)。

【讨论】:

  • 这很有帮助。结合上面的评论(curl 没有转义)现在很有意义。太糟糕了,我不再在那里工作了:)
猜你喜欢
  • 2020-03-04
  • 2012-12-24
  • 2012-08-13
  • 2014-07-29
  • 2011-07-07
  • 2021-05-05
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多