我搜索并尝试了一些以前的问题/示例代码,但无法使其正常工作。
我试图通过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!
答案 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);
}