【问题标题】:Adding file to zip with php using loop cause damaged zip file使用循环将文件添加到 php 导致损坏的 zip 文件
【发布时间】:2017-10-17 06:18:14
【问题描述】:

我正在使用以下 php 脚本通过 php 将文件添加到 Zip。

<?php
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
session_start();

$zip = new ZipArchive();
$zip_name = time().".zip"; // Zip name
$zip->open($zip_name,  ZipArchive::CREATE);

$filesinSession = $_SESSION['files'];
$filesToAdd = explode(';', $filesinSession);
for($i = 1 ; $i <= sizeof($filesToAdd)-1 ; $i++)
{
    //echo $filesToAdd[$i]."<br>";
    $zip->addFile($filesToAdd[$i]);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

header('Content-type: application/zip');
header('Content-disposition: filename="' . $zip_name . '"');
header("Content-length: " . filesize($zip_name));
$zip_file = file_get_contents($zip_name);
readfile($zip_name);
exit();

?>

注意:会话包含文件名分号分隔。

上述代码执行后生成的文件。当我以崇高的文本打开该文件时已损坏。它显示以下错误。

//////////////////////////////////////////////////////////////////// ////////////
警告:filesize(): stat failed for 1508220713.zip in C:\xampp\htdocs\HMApp1\download.php21 b>

警告:file_get_contents(1508220713.zip):无法打开流:C:\xampp\htdocs\HMApp1\download.php 中没有这样的文件或目录22 行

警告:readfile(1508220713.zip):无法打开流: 中没有这样的文件或目录C:\xampp\htdocs\HMApp1\download.php23 行

【问题讨论】:

  • 您是否有足够的权限来创建文件¿?
  • @ÁlvaroTouzón 压缩文件是在我的脚本所在的同一文件夹中创建的。但是,当我尝试阅读该 zip 以进行下载时,它会引发上述三个错误。
  • 那么似乎 php 没有本地化你的 .zip 文件,
  • @ÁlvaroTouzón 那我该怎么办?
  • 你叫 $zip->close(); ?

标签: php zip


【解决方案1】:

我在你的代码中发现了一些经典错误,在这里

假设您的会话包含相对存在于同一目录中的文件

$filesinSession = 'gallery/1/t.jpg;gallery/1/t2.jpg;'; // if ending with ;

添加修剪$filesToAdd = explode(';', trim($filesinSession, ';'));

使用0 代替1

for ($i = 0; $i <= sizeof($filesToAdd) - 1; $i++) {

在添加过程中添加本地文件名 // 最佳实践

$zip->addFile($filesToAdd[$i], basename($filesToAdd[$i]));

别忘了关闭

$zip->close();

固定标题

header('Content-Disposition: attachment; filename="' . $zip_name . '"');

已移除 file_get_contents你不需要它

clean buffer // 转义服务器错误

ob_end_clean();
flush();

完整来源

$zip = new ZipArchive();
$zip_name = time() . ".zip"; // Zip name
$zip->open($zip_name, ZipArchive::CREATE);

$filesinSession = 'gallery/1/t.jpg;gallery/1/t2.jpg;';
$filesToAdd = explode(';', trim($filesinSession, ';'));
for ($i = 0; $i <= sizeof($filesToAdd) - 1; $i++) {
    $zip->addFile($filesToAdd[$i], basename($filesToAdd[$i]));
}
$zip->close();
$size = filesize($filename);
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $zip_name . '"');
header("Content-length: " . filesize($zip_name));
ob_end_clean();
flush();
readfile($zip_name);
exit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多