Я работаю над редактором HTML WYSIWYG, и сейчас я работаю над функцией «Загрузить», где пользователь может нажать кнопку «Загрузить», чтобы загрузить zip-файл своей темы. Я использую скрипт CGI Python для достижения этой функции. В настоящее время мой скрипт создает zip-файл и предлагает пользователю загрузить его, но когда я пытаюсь распаковать zip-файл, он создает только другой zip-файл с расширением «.cpgz». Я считаю, что мой скрипт не создавал почтовый индекс.Создать Zipfile в Python в памяти на веб-сервере
Я использую модуль zipfile для создания zipfile-объекта в памяти вместо Disk, модуля StringIO для создания файлового объекта в памяти и модуля cgi для приема данных POST от Ajax запрос.
Моя проблема в моей петле. 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()
UPDATE 1: Я избавилась от некоторых неактуальных вещей, который был в моем коде. Я также исправляю опечатку с помощью «absfn» и «adsfn». Теперь приведенный выше код представляет собой то, что я имею в своем локальном редакторе кода. У меня по-прежнему возникает одна и та же проблема: не удается распаковать zip-файл, который был создан.
ОБНОВЛЕНИЕ 2: Вот как выглядит каталог «Маркетинг» на моем компьютере.
|---- Marketing
|---- css
| |---- default.css
|
|---- img
|
|---- index.html
В качестве дополнительной заметки ['os.path.relpath'] (http://docs.python.org/2/library/os.path.html#os.path.relpath) намного лучший способ получить относительный путь, чем пытаться выработать длину префикса и отрезать его вручную. – abarnert
Кроме того, '\ r \ n \ n' почти никогда не то, что вы хотите в любом контексте. Если вам нужно отправить CRLF, вам нужно '\ r \ n \ r \ n'. Если вы этого не сделаете, вы просто хотите '\ n \ n'. Я не могу придумать ни одного случая, когда вам нужны CRLF и некоторые простые LF. – abarnert
И, наконец, это ваш фактический код? Если это так, ваша проблема - простая опечатка: 'adsfn' поднимет' NameError', потому что такой переменной нет. Если нет, то, пожалуйста, дайте нам [SSCCE] (http://sscce.org), который фактически запускает и демонстрирует проблему. (Еще одна его часть - это SSCCE, которая удаляет ненужные вещи. Если вы не считаете, что материал CGI связан с проблемой, дайте нам более простую программу, которая просто создает zip-файл и, скажем, сохраняет его в локальном файле.) – abarnert