为什么zip文件在下载后无法打开但通过手动传输可以打开?

时间:2017-04-27 20:41:41

标签: php download zip

我搜索并尝试了一些以前的问题/示例代码,但无法使其正常工作。

我试图通过PHP代码将结果传递给最终用户。这是我的代码。

       $varZipFile = $varBaseNameParts[0] . '.' . $varDate . '.zip';
       $varZipDir = $varBaseNameParts[0] . '_' . $varDate;

       $zip = new ZipArchive();
       $zip->open($varZipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE);
       $zip->addFile('008.csv');
       $zip->addFile('002.csv');
       $zip->close(); // mark line xxx

       header("Content-Type: application/zip");
       header("Content-disposition: attachment;filename=$varZipFile");
       header('Content-Length: ' . filesize($varZipFile)); // with or without this line, got the same error 
       header("Content-Type: application/force-download"); // with or without this line, got the same error 
       readfile($varZipFile);

我的浏览器中有.zip文件。但WinZip无法打开它,也不能7-Zip。 WinZip抱怨"错误:未找到中心目录"。

有趣的是,当我通过WinSCP从我的服务器手动传输文件到我的Windows机器时,我可以用WinZip或7-Zip打开文件。这表示它可以很好地标记行xxx'并且标题行中出现问题。

TIA!

2 个答案:

答案 0 :(得分:1)

在尝试提供下载之前,可能无法清除您的输出缓冲区。尝试在使用ob_clean()函数提供下载之前清理输出缓冲区,如下所示:

$zip->close(); // mark line xxx
ob_clean();

答案 1 :(得分:0)

您的代码在我身边运行良好,调试此$varBaseNameParts[0]以查看值是否正确或尝试以下代码。

// $name = name of the archive
// $archive_directory = directory to save the archive
// $file_array = list of files
function create_archive($name, $archive_directory, $file_array) {
    $target_file = $archive_directory . '/' . $name . date('m-d-y').date('h-i-sa') . '.zip';
    $zip = new ZipArchive();
    if (count($file_array)) {
        if ($zip->open($target_file, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)) {
            foreach ($file_array as $file) {
                $zip->addFile($file);
            }
            $zip->close();
            chmod($target_file, 0777);
            return $target_file;
        }
    }
    return null;
}

function create_download($archive) {
    $file_name = basename($archive);
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($archive));

    readfile($archive);
}

// create the archive file
$archive = create_archive('test', 'archive', ['008.csv', '002.csv']);
if ($archive) {
    create_download($archive);
}