【问题标题】:There is no file in Zip but when extract zip, there are files in itZip 中没有文件,但解压 zip 时,里面有文件
【发布时间】:2025-11-27 18:00:01
【问题描述】:

我到处搜索问题,但没有找到类似的问题。

我使用以下代码创建一个 zip 文件。 zip 文件的容量似乎是正常的,因为它有文件。当我双击它时,我可以看到我的 zip 中的文件。但是当我提取 zip 文件时,我看到文件已添加到两个不同的目录中,我的文件也添加了。

让我在下面更详细地解释一下。

$files = array(
          'bauhaus93regular-1519481745.382.ttf' => '../../../files/task_files/bauhaus93regular-1519481745.382.ttf',
          'dsc_0299-1518894123.175.jpg' => '../../../files/task_files/dsc_0299-1518894123.175.jpg', 
          'sertifika-1518371071.2923.pdf' => '../../../files/task_files/sertifika-1518371071.2923.pdf'
     );

$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $key=>$file) {
  $zip->addFile($file, $key);
}
$zip->close();

header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($zipname));
ob_clean();
readfile($zipname);
ob_flush();

zip file status image

有了它,我可以将文件下载为 file.zip。如果我点击两次,我的文件在里面。但它的大小是 14,9 MB。当我解压 zip 时,我可以看到我的所有文件,但这些文件位于两个不同的目录中并与它们同在;

files/task_files/(my_files)
xampp/htdocs/contract/files/task_files/(my_files)
(my_files)

extracted zip file image

第一个目录是我的本地主机地址,第二个是我硬盘上的物理目录和我的文件。

如果你能提供帮助,我很高兴。提前致谢。

请注意;由于需要,PHP 版本是 5.7。

【问题讨论】:

  • "如果我点击两次,里面没有任何文件。" ——这是一个非常粗略的观察。稍微解释一下怎么样?如果必须的话,可以使用截屏视频吗?尝试过另一个 ZIP 工具了吗?邮编测试?实际的标头调试(cmdline wget/curl)?尝试重新安装 Windows(必须从模糊的描述中假设您是 Windows 用户)?或者如果这是关于 PHP 代码:error_reporting 说什么?它在 CLI 上的表现如何?
  • 感谢您的评论。但我从来没有被如此糟糕地解释过。对不起,我的英语不够好:) 我在我的问题上放了一些图片。我尝试了 error_reporting,但 zip 下载浏览器窗口关闭,所以我看不到错误消息。
  • 尝试将这些文件移动到与php文件相同的目录并修改$files = array('file1.pdf','file2.tff');

标签: php zip zipfile


【解决方案1】:

尝试传递可选的local filename

$files = array(
              'bauhaus93regular-1519481745.382.ttf' => '../../../files/task_files/bauhaus93regular-1519481745.382.ttf',
              'sertifika-1518371071.2923.pdf' => '../../../files/task_files/dsc_0299-1518894123.175.jpg', 
              'sertifika-1518371071.2923.pdf' => '../../../files/task_files/sertifika-1518371071.2923.pdf'
         );

$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
foreach ($files as $key=>$file) {
  $zip->addFile($file, $key);
}
$zip->close();

【讨论】:

  • 谢谢你,维尼。我编辑了我的帖子,第一个问题得到了解决。我可以正常查看 zip 文件中的文件。但是当我提取 zip 文件时,显示了两个目录和我的文件。每个目录中的文件都已复制。一共复制了3次。我更新了图像。你觉得有缓存问题吗?
  • 是的,它有点“缓存”ZipArchive::OVERWRITE 将删除旧版本的 zip 文件,因此 php 将始终在没有此标志的情况下重新创建 php 默认情况下会尝试使用旧的 zip 文件,如果它已经存在。