使用Python上传Basecamp文件

0 投票
1 回答
697 浏览
提问于 2025-04-17 01:33

根据Basecamp的API文档,文件上传应该使用HTTP POST请求,内容类型设置为application/octet-stream,请求体里包含文件的二进制内容(具体可以查看这个链接)。我想要流式上传文件,而不是一次性把整个文件读入内存。我现在使用的是Python 2.7。

我看到几种可能的解决方案:

  • 使用底层的socket API来实现。
  • 用urllib2结合Poster库(这个链接)来处理文件流式上传。不过,使用Poster时需要为文件流式上传注册特殊的打开器,而我已经在明确使用自己的打开器(通过build_opener传入)来处理Basecamp服务器的认证。而且Poster的文档只提到如何上传表单数据,我现在还不清楚(还在阅读源代码)它是否能处理octet-stream。
  • 使用httplib。这个看起来能让我更底层地处理POST数据(这样我就可以使用octet-stream),但我还是没找到一个简单的方法来流式上传文件。

我找到了一篇关于Python:流式上传大文件的HTTP POST的帖子,但听起来如果我不想使用表单数据格式,就得对httplib进行修改(!)。不过那篇帖子已经有一年了,所以我希望现在有更好的方法。

现在我在考虑创建一个像Poster那样的混合类,但我在想:这真的那么难吗?难道没有更简单的方法来处理这个看起来相对标准的用例吗?

1 个回答

0

我最后选择使用Twisted,因为我需要上传操作是异步进行的。这个很棒的博客文章解释了大致的步骤:http://marianoiglesias.com.ar/python/file-uploading-with-multi-part-encoding-using-twisted/。我只是自己写了一个生产者,用来将原始的二进制数据作为POST请求的内容。

撰写回答