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