2

私の django プロジェクトでは、zip ファイルをクライアント側に送信してダウンロードする必要があります。この zip ファイルには、さまざまな URL からダウンロードした画像が含まれます。

画像ファイルをディスクに書き込まずにメモリ内の画像をダウンロードしてから、それらをメモリ自体の zip ファイルに追加し、再度 zip ファイルをディスクに書き込まず、最後に zip ファイルをクライアントに送信してダウンロードすることはできますか?

イメージのダウンロードには urllib2 を、zip ファイルの操作には zipfile を使用できますが、メモリ自体でこれらの操作を実行する際に問題に直面していることを認識しています。

ありがとうございました

4

2 に答える 2

3

urllib2 でファイルをダウンロードします。書き込み用に新しい ZipFile を開きます (これには StringIO オブジェクトが必要です)。URL からの出力を ZilpFile.writestr に書き込みます。zip ファイルを django レスポンスに添付します。

import urllib2
from StringIO import StringIO

url = urllib2.urlopen('http://example.com/foo.jpg')
f = StringIO()
zip = zipfile.ZipFile(f, 'w')
zip.writestr('foo.jpg', url.read())
response = HttpResponse(f.getvalue(), content_type="application/zip")
response['Content-Disposition'] = 'attachment; filename=foobar.zip'
return response
于 2012-04-19T19:53:48.590 に答える
0

簡単にそれを行うことができます:

response = urllib2.urlopen('http://..')
img_bytes = response.read()

次に、ZipFile.writestr を使用してこれらのバイトをファイルに書き込みます。以前に作成した Zip 内で、実際のファイル ハンドラーの代わりに StringIO ハンドラーを渡します。ファイルの書き込みが終了したら、適切な MIME タイプとコンテンツの処理を設定した HTTPResponse としてこれを返します。

But I wouldn't use the RAM for this. Why not use tempfile.NamedTemporaryFile?

于 2012-04-19T19:54:11.487 に答える