bugfix> python > 投稿

サーバーから複数の画像ファイルをダウンロードしようとしています。バックエンドにDjangoを使用しています。 単一の画像に関連する質問は既に行われています答えた そして、私はコードを試してみましたが、それは単一の画像で動作します。私のアプリケーションでは、1つのHTTP接続で複数の画像をダウンロードします。

from PIL import Image
img = Image.open('test.jpg')
img2 = Image.open('test2.png')
response = HttpResponse(content_type = 'image/jpeg')
response2 = HttpResponse(content_type = 'image/png')
img.save(response, 'JPEG')
img2.save(response2, 'PNG')
return response #SINGLE

両方の img を取得するにはどうすればよいですかおよび img2 すぐに。私が考えていた1つの方法は、両方の画像を圧縮し、クライアントサイズで解凍することですが、それが良い解決策だとは思いません。これを処理する方法はありますか?

回答 2 件
  • 私は周りを見て、ディスク上の一時的なZipファイルを使用して古いソリューションを見つけました:https://djangosnippets.org/snippets/365/

    更新が必要で、これが機能するはずです(django 2.0でテスト済み)

    import tempfile, zipfile
    from django.http import HttpResponse
    from wsgiref.util import FileWrapper
    def send_zipfile(request):
        """                                                                         
        Create a ZIP file on disk and transmit it in chunks of 8KB,                 
        without loading the whole file into memory. A similar approach can          
        be used for large dynamic PDF files.                                        
        """
        temp = tempfile.TemporaryFile()
        archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
        for index in range(10):
            filename = 'C:/Users/alex1/Desktop/temp.png' # Replace by your files here.  
            archive.write(filename, 'file%d.png' % index) # 'file%d.png' will be the
                                                          # name of the file in the
                                                          # zip
        archive.close()
        temp.seek(0)
        wrapper = FileWrapper(temp)
        response = HttpResponse(wrapper, content_type='application/zip')
        response['Content-Disposition'] = 'attachment; filename=test.zip'
        return response
    
    

    今、これは私の.pngを取得し、それを.zipに10回書き込み、送信します。

  • あなたのファイル/画像をZIPファイルに追加し、応答でそれを返すことができます。それが最善のアプローチだと思います。

    これを達成する方法のサンプルコードを次に示します(この投稿から)。

    def zipFiles(files):
        outfile = StringIO() # io.BytesIO() for python 3
        with zipfile.ZipFile(outfile, 'w') as zf:
            for n, f in enumarate(files):
                zf.writestr("{}.csv".format(n), f.getvalue())
        return outfile.getvalue()
    zipped_file = zip_files(myfiles)
    response = HttpResponse(zipped_file, content_type='application/octet-stream')
    response['Content-Disposition'] = 'attachment; filename=my_file.zip'
    
    

    それ以外の場合(ZIPファイルが気に入らない場合)、クライアントから個別の要求を行うことができます。

あなたの答え