根据 Basecamp API 文档,文件应使用 HTTP POST 上传,内容类型设置为 application/octet-stream 和包含文件二进制内容的请求正文(请参阅http://developer.37signals.com/basecamp/) . 我想流式传输文件而不是将整个内容读入内存。我正在使用 Python 2.7。
我可以看到一些可能性:
- 使用低级套接字 API 执行此操作。
- 使用带有 Poster ( http://atlee.ca/software/poster/ ) 的 urllib2 来处理文件流。但是,使用Poster,您可以为文件流注册特殊的开启程序,并且我已经明确使用我自己的开启程序(将其传递给build_opener)来处理Basecamp服务器上的身份验证。此外,海报文档只谈论发布表单数据,我还不清楚(仍在阅读源代码)它是否可以处理八位字节流。
- 使用 httplib。这看起来会给我对 POST 数据的更多低级处理(所以我可以使用八位字节流),但我仍然看不到流式传输文件的简单方法。
我发现Python: HTTP Post a large file with streaming但听起来除非我想使用表单数据格式,否则我必须修补 httplib(!)。那篇文章已经有一年了,所以我希望现在有更好的方法。
现在我正在研究像 Poster 一样创建自己的 mixin,但想知道:这真的很难吗?难道没有更简单的方法来处理我认为相对标准的用例吗?