0

Basecamp API ドキュメントによると、コンテンツ タイプを application/octet-stream に設定し、リクエスト ボディにファイルのバイナリ コンテンツを含む HTTP POST を使用してファイルをアップロードする必要があります ( http://developer.37signals.com/basecamp/を参照) 。 . 全体をメモリに読み込むのではなく、ファイルをストリーミングしたいと思います。Python 2.7 を使用しています。

いくつかの可能性が見えます:

  • これは、低レベルのソケット API を使用して行います。
  • ファイル ストリーミングを処理するには、 Poster ( http://atlee.ca/software/poster/ )で urllib2 を使用します。ただし、Poster を使用すると、ファイル ストリーミング用の特別なオープナーを登録できます。私はすでに、独自のオープナーを明示的に使用して (build_opener に渡します)、Basecamp サーバーでの認証を処理しています。また、ポスターのドキュメントはフォームデータの投稿についてのみ説明しており、オクテットストリームを処理できるかどうかはまだわかりません(ソースコードをまだ読んでいます)。
  • httplib を使用します。これにより、POST データのより低レベルの処理が可能になるように見えます (そのため、octet-stream を使用できます) が、ファイルをストリーミングする簡単な方法はまだわかりません。

Python: HTTP Post a large file with streamingを見つけましたが、フォーム データ形式を使用しない限り、httplib (!) にパッチを適用する必要があるように思えます。その投稿は1年前のものなので、今はもっと良い方法があることを願っています.

現在、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 に答える