Я работаю над редактором HTML WYSIWYG, и в настоящее время я работаю над функцией «Загрузить», где пользователь может нажать кнопку «Загрузить», чтобы загрузить zip-файл своей темы. Я использую скрипт Python CGI для реализации этой функции. В настоящее время мой скрипт создает zip-файл и предлагает пользователю загрузить его, но когда я пытаюсь распаковать zip-файл, он создает только другой zip-файл с расширением «.cpgz». Я считаю, что мой скрипт неправильно создал zip.
Я использую модуль «zipfile» для создания объекта zipfile в памяти, а не на диске, модуль «StringIO» для создания файлового объекта в памяти и модуль «cgi» для приема данных POST из запроса Ajax.
Моя проблема в моем цикле for. ZIP-файл «zf» не добавляет файлы и подкаталоги из параметра «layoutDir», который я передал в os.walk(). Сценарий предложит браузеру загрузить 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
os.path.relpath
— это гораздо лучший способ получить относительный путь, чем пытаться определить длину префикса и отрезать его вручную. - person abarnert   schedule 06.01.2014\r\n\n
почти никогда не является тем, что вам нужно в любом контексте. Если вам нужно отправить CRLF, вам нужно\r\n\r\n
. Если вы этого не сделаете, вы просто хотите\n\n
. Я не могу вспомнить ни одного случая, когда вам нужны какие-то CRLF и какие-то простые LF. - person abarnert   schedule 06.01.2014adsfn
вызоветNameError
, потому что такой переменной нет. Если нет, предоставьте нам SSCCE, который действительно работает и демонстрирует проблему. (Другая часть SSCCE заключается в удалении ненужного материала. Если вы не думаете, что материал CGI связан с проблемой, дайте нам более простую программу, которая просто создает zip-файл и, скажем, сохраняет его в локальный файл.) - person abarnert   schedule 06.01.2014