Google App Engine(Python)用フレームワークKayを使い、動的にZIP形式で圧縮してダウンロードさせる

Google App Engine(Python)用フレームワークKayを使い、動的にZIP形式で圧縮してダウンロードさせる方法。

フレームワークにKayを使用していますが、処理の内容はKayに依存しません。
webappやDjangoでも同様の処理は可能です。

まず、ZIPファイルに登録するファイルのデータ(バイト列)を作成します。

# example.htmlの内容
data = '<html><body><p>Hello, world!</p></body></html>'

ZipFileオブジェクトを作成します。

ZipFileオブジェクトのコンストラクタの1番目の引数にファイルライクなオブジェクトを指定します。
引数に指定したファイルライクなオブジェクトに、ZIPデータが書き込まれます。

zipdata = StringIO.StringIO()
zipobj =  zipfile.ZipFile(zipdata, 'w', zipfile.ZIP_DEFLATED)

ZipFileオブジェクトにファイルを登録します。
1番目の引数にファイル名を、2番目の引数にファイルのデータ(バイト列)を指定します。

zipobj.writestr('example.html', data)

ここで、1番目の引数にZipInfoオブジェクトを指定すると、ファイルの情報を細かく設定することが出来ます。

最後に閉じます。

zipobj.close()

以上で、ZIPデータを作成できました。

作成したZIPデータをダウンロードさせるために、HTTPヘッダの設定を行います。

header = Headers()
header.add('Content-Type', 'application/octet-stream');
header.add('Content-Disposition', 'attachment', filename='foo.zip')

最後に、ZIPデータをレスポンスとして返します。

return Response(zipdata.getvalue(), headers=header)

全体のソースコードは以下のようになります。

def index(request):
    import StringIO
    import zipfile
    from werkzeug.datastructures import Headers
    from werkzeug import Response

    # example.htmlの内容
    data = '<html><body><p>Hello, world!</p></body></html>'

    # ZIPデータの作成
    zipdata = StringIO.StringIO()
    zipobj =  zipfile.ZipFile(zipdata, 'w', zipfile.ZIP_DEFLATED)
    zipobj.writestr('example.html', data)
    zipobj.close()

    # データを返す
    header = Headers()
    header.add('Content-Type', 'application/octet-stream');
    header.add('Content-Disposition', 'attachment', filename='foo.zip')
    return Response(zipdata.getvalue(), headers=header)

関連ページ

コメント

  1. Pingback: Google App Engine(Python)用フレームワークKayを使い、動的にExcelファイルを作成してZIP形式で圧縮しダウンロードさせる « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください