帮助创建 ZIP 文件 Windows 不会阻止

bsc*_*fer 3 php linux windows zip encoding

我制作了一个应用程序,它从 hg 存储库中获取项目的标记版本,并创建该标记修订的可下载 ZIP 文件。

这些文件是使用 CodeIgniter 的 ZIP 编码库在运行 Linux 的 MediaTemple 服务器上创建的。一切正常……在 Mac 上。但是,当我在 Windows 计算机上下载文件时,存档被阻止解压缩。

该ZIP包括.html.css.gif.png.js文件,我敢肯定的.js文件是安全的罪魁祸首,但我想知道为什么我可以下载Jcrop jQuery插件(或任何其他的例子)作为一个ZIP文件并解压它没有Windows不断干扰,尽管它显然包含.js文件,但我的 ZIP 文件中的某些内容存在安全风险。

通常我只会为我的特定情况找到一个快速的软件解决方法,但由于计划是出售对这些文件的访问权限,因此快速软件修复或常见问题解答似乎对用户不太友好。

任何反馈将不胜感激!如果您需要更多信息,请告诉我。

您可以在此处下载示例文件。

编辑:

  • 我正在运行 Windows XP
  • 我没有运行防病毒软件
  • 警告是:Windows 已阻止访问这些文件以帮助保护您的计算机
  • 我已取消阻止该文件,但没有任何作用
  • 该文件在我的桌面上

编辑2:

  • 我在底部添加了一个示例文件。或者你可以在这里看到
  • 我只在 XP 和 Windows 7 上使用过默认提取工具。
  • ZIP 在 Windows 上似乎是空的,我无法看到或打开任何文件。

编辑 3:

  • 从评论和答案来看,文件名似乎是问题所在,因为/在过程中的某处添加了额外的内容。我上传了一个由我的应用程序生成的新示例下载,文件名为 fix,您可以在此处下载。如果这能解决问题,请告诉我。

Jac*_*cob 5

实际上,前导的“/”是导致不允许提取 zip 的原因。我已经通过编写一个 Python 脚本来创建一个没有绝对文件路径的 zip 文件的修改版本来证明这一点:

from zipfile import *

orig = ZipFile('download.zip', 'r')
fixed = ZipFile('fixed.zip', 'w')
for fileinfo in orig.infolist():
    fixed.writestr(fileinfo.filename[1:], orig.read(fileinfo.filename)) 
fixed.close()
Run Code Online (Sandbox Code Playgroud)

(这不会重新压缩文件,但它证明是导致问题的文件名)

如果您使用的是 CodeIgniter zip 库的 function read_dir,那么这一定是使用绝对文件路径的罪魁祸首。尝试使用 PHP 递归遍历目录结构并改用add_data函数。这允许您为每个文件使用任意路径结构,因此您可以编写相对路径。