0

根据 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,但想知道:这真的很难吗?难道没有更简单的方法来处理我认为相对标准的用例吗?

4

1 回答 1

0

我最终为此使用了 Twisted,因为无论如何我都需要异步进行上传。这篇出色的博客文章解释了一般程序: http: //marianoiglesias.com.ar/python/file-uploading-with-multi-part-encoding-using-twisted/。我只是编写了自己的生产者,而不是将原始二进制数据写入 POST 有效负载。

于 2011-09-07T07:27:25.163 回答