私はHTML WYSIWYGエディターに取り組んでおり、現在、ユーザーがダウンロードボタンを押してテーマのzipファイルをダウンロードできる「ダウンロード」機能に取り組んでいます。この機能を実現するために Python CGI スクリプトを使用しています。現在、私のスクリプトは zip ファイルを作成し、それをダウンロードするようユーザーに促しますが、zip ファイルを解凍しようとすると、拡張子が「.cpgz」の別の zip ファイルしか作成されません。私のスクリプトが zip を適切に作成しなかったと思います。
「zipfile」モジュールを使用してディスクではなくメモリ内に zipfile オブジェクトを作成し、「StringIO」モジュールを使用してメモリ内にファイルのようなオブジェクトを作成し、「cgi」モジュールを使用して Ajax リクエストから POST データを受け取ります。
私の問題は、for ループにあります。「zf」zip ファイルは、os.walk() に渡した「layoutDir」パラメーターからファイルとサブディレクトリを追加していません。スクリプトはブラウザーに zip ファイルをダウンロードするように促しますが、解凍できません。
#!/usr/bin/python
import sys
import os
import zipfile
import StringIO
import cgitb
cgitb.enable()
layoutDir = 'http://localhost:8888/funWYSIWYG/public/views/layouts/Marketing'
tmpZip = StringIO.StringIO()
zf = zipfile.ZipFile(tmpZip, 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(layoutDir):
for name in files:
absfn = os.path.join(root, name)
relfn = absfn[len(layoutDir) + len(os.sep):]
zf.write(absfn, relfn)
zf.close()
sys.stdout.write("Content-Type: application/octet-stream\r\n")
sys.stdout.write("Content-Disposition: attachment; filename=\"funWYSIWYG-Marketing.zip\"\r\n\r\n")
sys.stdout.write(tmpZip.getvalue())
# Close opened file
tmpZip.close()
更新 1: コードに含まれていた無関係なものをいくつか削除しました。また、「absfn」と「adsfn」のタイプミスを修正します。上記のコードは、ローカルのコード エディターにあるものを正確に表しています。作成したzipファイルを解凍できないという同じ問題がまだあります。
更新 2: 私のコンピューターの「マーケティング」ディレクトリは次のようになります。
|---- Marketing
|---- css
| |---- default.css
|
|---- img
|
|---- index.html