1

我正在开发一个 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
4

1 回答 1

0

如果这是您的实际代码,那么您的问题是一个简单的错字:

zf.write(adsfn, relfn)

你没有一个名为的变量adsfn,你有一个名为的变量absfn。因此,这将引发 aNameError并且无法返回任何内容。

如果我解决了这个问题,然后运行此代码并layoutDir设置为具有某种层次结构的合理相对路径,并将生成的内存中 zipfile 存储到磁盘,如下所示:

with open('foo.zip', 'wb') as f:
    f.write(tmpZip.getvalue())

…然后我最终得到一个 zipfile,其中所有文件都正确存储,这意味着完全没有问题。

因此,如果该错字不是您的问题,那么无论您的问题什么,您发布的代码与我们看不到的实际代码之间似乎存在一些其他差异。


看起来您的实际问题是,在您的真实代码中,您尝试使用绝对或相对URLhttp://localhost:8888/path-to/Marketing例如layoutDir. URL 和路径不是一回事。如果您尝试将其用作路径一,它实际上将与./http:/localhost:8888/path-to-Marketing. 您几乎可以肯定没有http:在当前工作目录中命名的目录,因此os.walk不会产生任何结果,这意味着您最终将创建一个空的 zip 文件。

如果您尝试添加的文件实际上在某个(相对或绝对)路径中可用,请使用该路径代替 URL,您的问题就会消失。

如果它们只能通过 HTTP 获得,那么您尝试做的事情是不可能的;无法遍历 HTTP URL 的“子目录”;这个概念甚至没有意义。当然,在许多情况下,Web 服务器会将部分 URL 路径映射到某个文件系统路径,并提供一些间接导航该文件系统的方法(例如,通过选择自动生成一个包含链接的 index.html 页面),但是要利用这一点,您需要准确了解相关服务器如何公开该信息,然后编写抓取代码以利用它。然后,即使您拥有所有链接,也无法将 URL 传递给zipfile.write,而只能传递给文件。这意味着您必须下载每个 URL(例如,将其读入内存然后读取writestr结果)。

于 2014-01-06T05:51:49.017 回答