大家好,我已经过了几天没有任何回应我试图解决问题,我在php上并不擅长,但我正在尽我所能。
我想自动下载,而不是在服务器上保存一个名为Bigzip的拉链
在这个Bigzip中: - 另一个叫做Smallzip的拉链
但是打开下载的zip时出现错误,已损坏
<?php
//Big and Small Archives names
$BzipN='Bigzip.zip';
$SzipN='Smallzip.zip';
//Big and Small Archives
$Bzip = new ZipArchive();
$Szip = new ZipArchive();
//File path
$file_path=$_SERVER['DOCUMENT_ROOT'].'/PF/';
zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path);
function zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path)
{
//create the file and throw the error if unsuccessful
if ($Bzip->open($BzipN, ZIPARCHIVE::CREATE )!==TRUE) {
exit("cannot open <$BzipN>\n");
}
if ($Szip->open($SzipN, ZIPARCHIVE::CREATE )!==TRUE) {
exit("cannot open <$SzipN>\n");
}
//Add Smallzip to BigZip
$Bzip->addFile($file_path.$SzipN,$Szip);
$Szip->close();
$Bzip->close();
//then send the headers to foce download the Big zip file
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$BzipN");
header("Content-length: " . filesize($BzipN));
header("Pragma: no-cache");
header("Expires: 0");
readfile("$BzipN");
exit;
}
?>
如果您有任何其他选择,想法和建议,我会很乐意接受它。
谢谢
答案 0 :(得分:1)
问题编号1:
您无法在空的zip存档中创建空的zip存档。这将导致文件损坏。
第2期:
当你还没有关闭第一个zip存档时,不要尝试将zip存档添加到另一个zip存档。
第3期:
$Bzip->addFile($file_path.$SzipN,$Szip);
那你为什么要把对象设置为你的文件名呢? =&GT; $Szip = new ZipArchive();
<强>解决方案:强>
<?php
//Big and Small Archives names
$BzipN='Bigzip.zip';
$SzipN='Smallzip.zip';
//Big and Small Archives
$Bzip = new ZipArchive();
$Szip = new ZipArchive();
//File path
$file_path=$_SERVER['DOCUMENT_ROOT'].'/PF/';
function zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path){
// Create the file Smallzip.zip and throw the error if unsuccessful
if ($Szip->open($SzipN, ZIPARCHIVE::CREATE )!==TRUE) {
exit("cannot open <$SzipN>\n");
}
// Add a txt file to Smallzip so it isn't empty
$Szip->addFromString("testfilephp.txt", "#1 This is a test string added as testfilephp.txt.\n");
// Close Smallzip.zip as we're done with it
$Szip->close();
// Create the file Bigzip.zip and throw the error if unsuccessful
if ($Bzip->open($BzipN, ZIPARCHIVE::CREATE )!==TRUE) {
exit("cannot open <$BzipN>\n");
}
// Add Smallzip.zip to Bigzip.zip with a valid name
$Bzip->addFile($file_path.$SzipN,$SzipN);
// Close Bigzip.zip as we're done with it
$Bzip->close();
//then send the headers to foce download the Big zip file
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$BzipN");
header("Content-length: " . filesize($BzipN));
header("Pragma: no-cache");
header("Expires: 0");
readfile("$BzipN");
// Delete the files from the server, even if the user cancels the download
ignore_user_abort(true);
unlink($file_path.$SzipN);
unlink($file_path.$SzipN);
exit;
}
zipFilesAndDownload($BzipN,$SzipN,$Bzip,$Szip,$file_path);
?>
答案 1 :(得分:-1)
如果你不想在服务器上保存文件只是echo创建的文件。 index.php
<form action="test.php" method="post">
To file: <input type="text" name="tofile" />
<input type="submit" />
</form>
test.php的
<?php
$filename = 'test-download.zip';
$htmlcode1 = "<HTML> \n <BODY>";
$htmlcode2 = "</BODY> \n <HTML>";
$somecontent = $htmlcode1.$_POST["tofile"].$htmlcode2;
!$handle = fopen($filename, 'w');
fwrite($handle, $somecontent);
fclose($handle);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize("$filename").";");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; ");
header("Content-Transfer-Encoding: binary");
readfile($filename);
?>