使用循环使用php添加文件到zip会导致损坏的zip文件

时间:2017-10-17 06:18:15

标签: php zip

我使用以下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();

?>

注意:session包含以分号分隔的文件名。

由于上述代码执行而生成的文件。当我用崇高文本打开该文件时,它被损坏了。它显示以下错误。

///////////////////拉链以崇高的文字打开/////////////////////// ////////////
警告:filesize():对 C:\ xampp \ htdocs \ HMApp1 \ download.php 中的1508220713.zip的统计信息失败 21 <登记/>
警告:file_get_contents(1508220713.zip):无法打开流: C:\ xampp \ htdocs \ HMApp1 \ download.php 行中没有此类文件或目录> 22

警告:readfile(1508220713.zip):无法打开流: C:\ xampp \ htdocs \ HMApp1 \ download.php 行中没有此类文件或目录> 23

1 个答案:

答案 0 :(得分: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您不需要

清理缓冲区//转义服务器错误

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();