无法提取使用 php 生成的 zip 文件

Posted

技术标签:

【中文标题】无法提取使用 php 生成的 zip 文件【英文标题】:Unable to extract zip file which generated using php 【发布时间】:2017-11-16 11:09:37 【问题描述】:

我已经编写了 php 脚本来生成 zip 文件。当我使用 rar 软件提取它但没有使用 rar 软件提取它时,它工作正常。我不能要求用户安装 rar 软件来提取下载的 zip 文件。

我不知道我在哪里犯了错误。 在这里,我附上了尝试打开 zip 文件时得到的错误屏幕截图。

// Here is code snippet
$obj->create_zip($files_to_zip, $dir . '/download.zip');

// Code for create_zip function
//create the archive
$zip = new ZipArchive();
if ($zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) 
    return false;

//add the files
foreach ($valid_files as $file)     
    $filearr = explode('/', $file);
    $zip->addFile($file, end($filearr));

$zip->close();

【问题讨论】:

【参考方案1】:

如果 $valid_files 是一个全局数组,使用 basename() 而不是 end(),你的 zip 可能实际上没有添加任何文件,导致它是一个无效的 zip(但是这在zip 文件)。

也可以试试 winrar/winzip/7zip 看看它们返回什么,微软的内部 zip 引擎可能不是最新的,无法打开 zip。

【讨论】:

谢谢,我刚刚从页面顶部和 html 中删除了空格,它运行良好。【参考方案2】:

我也遇到过这个问题,使用 7z 解决了这个问题,但我们需要将 zip 发送给其他人,所以 7z 是 nono。

我发现,在我的情况下是文件路径太长:

当我使用这个时:

$zip->addFile($files_path.'/people.txt');

它生成了一个嵌套非常深的 zip 文件夹,例如["/tmp/something/something1/something2/people.txt"]

所以我需要改用这个

$zip->addFile($files_path.'/people.txt', 'people.txt');

其中生成了一个只有1层的zip文件夹[“people.txt”],Windows Zip读取完美~

希望这对同样有此问题的人有所帮助!

【讨论】:

谢谢。刚刚遇到了同样的问题,有人指出我在这里。

以上是关于无法提取使用 php 生成的 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP提取zip [重复]

上传前客户端 zip 文件提取的选项

在php中提取ZIP,覆盖所有内容

PHP Zip:提取目录的内容

7z 无法提取包含 ZipFile.CreateFromDirectory 的 .zip 文件

使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?