2012-04-19 15 views
1

に送信します。ダウンロードの画像は、私は、さまざまなURLのからダウンロードした画像を含んでいるでしょうzipファイルをdownload.Thisためのクライアント側にzipファイルを送信する必要が私のDjangoプロジェクトでは、ブラウザ

イメージファイルをディスクに書き込まずにメモリにダウンロードし、メモリにあるzipファイルに追加したり、zipファイルをディスクに書き込んだりしないで、zipファイルをクライアントにダウンロードしてダウンロードすることはできません?

私は、urllib2はイメージのダウンロードに使用でき、zipファイルはzipファイルを扱うために使用できますが、メモリ自体にこれらの操作を実行することに問題があることに気付いています。

ありがとうございました

答えて

2

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

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

をして、ジップの内側に、あなたは以前に実際のファイルの代わりにのStringIOハンドラを渡して作成し、ファイルにこれらのバイトを書き込むためにZipFile.writestrを使用します。

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 
+0

返信いただきありがとうございます。しかし、クライアント側では、私はダイアログとしてファイルを保存していません。私はこれをクロムブラウザで試しました。 – user1283941

+0

サーバーがあなたに与える応答は何ですか? – John

+0

私はそれはいくつかちんぷんかんぷんのcharacters.Theのレスポンスヘッダが接続されている示しペイン応じて、クロムデバッガでチェック:キープアライブ コンテンツディスポジション:添付ファイルを。ファイル名= foobar.zip コンテンツタイプ:application/zip 日時:2012年4月19日21:19:18 GMT P3p:CP = "IDC CURA ADMA OUR IND PHY ON COM STA" サーバー:gunicorn/0.14。 2 転送エンコーディングは:私は、私のミスを:) AJAXを介して要求を作っていた、本当に申し訳ありません – user1283941

0

あなたは、単に、それを行うことができますハンドラ。ファイルの書き込みが終了したら、これをHTTPResponseとして返し、適切なMIMEタイプとコンテンツの配置を設定します。

しかし、私はこのためにRAMを使用することはありません。なぜtempfile.NamedTemporaryFileを使用しないのですか?

+0

「例外TypeErrorをユニコード引数が期待されるが、 『STR』を得た」とそれでも私はそれがあまり役に立たないとは思っていません。あなたがやっているのは、不必要なディスクioを追加することです(Webサーバーの制限要因になる可能性がさらに高いです)。 – John

+0

そのダウンロード操作のユーザーの同時実行性によって異なります。彼が様々なリンクから写真をオンザフライでつかむと、メモリがクリアされるまでに時間がかかることがあります。 Djangoのドキュメントから:デフォルトでは、アップロードされたファイルが2.5メガバイトより小さい場合、Djangoはアップロードの全内容をメモリに保持します。だから、使用量の大きさと並行性に依存します。 –

関連する問題