PHP使用2个字符串变量生成zip文件

PHP使用2个字符串变量生成zip文件,php,zip,download,Php,Zip,Download,所以我要做的是取2个字符串,创建2个文件。然后从这些文件中创建一个zip文件,让用户下载它们 以下是我所拥有的: $string1 = 'Some data some data some data'; $string2 = 'Some data some data some data'; $zip = new ZipArchive(); $filename = "test.zip"; if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TR

所以我要做的是取2个字符串,创建2个文件。然后从这些文件中创建一个zip文件,让用户下载它们

以下是我所拥有的:

$string1 = 'Some data some data some data';
$string2 = 'Some data some data some data';


$zip = new ZipArchive();
$filename = "test.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}


$zip->addFromString("string1.txt", $string1);
$zip->addFromString("string2.txt", $string2);
$zip->close();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize('test.zip'));
$string1='Some data Some data Some data';
$string2='Some data Some data Some data';
$zip=新的ZipArchive();
$filename=“test.zip”;
如果($zip->open($filename,ZIPARCHIVE::CREATE)!==TRUE){
退出(“无法打开”);
}
$zip->addFromString(“string1.txt”,$string1);
$zip->addFromString(“string2.txt”,$string2);
$zip->close();
标题(“Pragma:public”);
标题(“到期日:0”);
标头(“缓存控制:必须重新验证,后检查=0,前检查=0”);
标头(“缓存控制:公共”);
标题(“内容描述:文件传输”);
标题(“内容类型:应用程序/八位字节流”);
标题(“内容处置:附件;文件名=\”.$filename.\”);
标题(“内容传输编码:二进制”);
标题(“内容长度:”.filesize('test.zip');

到目前为止没有运气。非常感谢您的帮助。

您错过了最重要的部分-输出文件!:)

加:

到php文件的末尾


此外,HTTP内容长度标头的计算错误:

header("Content-Length: ".filesize($zip));
这将始终为0(或false),因为filesize需要一个文件名作为其参数

将行更改为:

header("Content-Length: ".filesize('test.zip'));

完成这两项操作后,zip将成功下载并包含这两个文件。对于completenes,下面是完整的工作示例:

$string1 = 'Some data some data some data';
$string2 = 'Some data some data some data';


$zip = new ZipArchive();
$filename = "test.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}


$zip->addFromString("string1.txt", $string1);
$zip->addFromString("string2.txt", $string1);
$zip->close();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
// make sure the file size isn't cached
clearstatcache();
header("Content-Length: ".filesize('test.zip'));
// output the file
readfile('test.zip');
$string1='Some data Some data Some data';
$string2='Some data Some data Some data';
$zip=新的ZipArchive();
$filename=“test.zip”;
如果($zip->open($filename,ZIPARCHIVE::CREATE)!==TRUE){
退出(“无法打开”);
}
$zip->addFromString(“string1.txt”,$string1);
$zip->addFromString(“string2.txt”,$string1);
$zip->close();
标题(“Pragma:public”);
标题(“到期日:0”);
标头(“缓存控制:必须重新验证,后检查=0,前检查=0”);
标头(“缓存控制:公共”);
标题(“内容描述:文件传输”);
标题(“内容类型:应用程序/八位字节流”);
标题(“内容处置:附件;文件名=\”.$filename.\”);
标题(“内容传输编码:二进制”);
//确保未缓存文件大小
clearstatcache();
标题(“内容长度:”.filesize('test.zip');
//输出文件
readfile('test.zip');
您有一个PHP错误(您可能没有打开错误报告或错误级别不够高)

函数的作用是获取字符串而不是对象。filesize($filename)将起作用

要启用错误报告,请执行以下操作:

错误报告(E|u ALL | E|u STRICT); ini设置(“显示错误”,1)

或者在php.ini中执行此操作,在所有这些header()调用之后,我想您需要:

readfile($filename); 

$zip->addFromString(“string2.txt”,“string1”)
应该是
$zip->addFromString(“string2.txt”,“string2”)我看不到您实际在哪里传输您创建的zip?嗯…我应该做些什么来传输?请启用错误日志记录,将级别设置为高,然后按照您的错误日志进行传输。修复报告的错误。如果你仍然没有抓住要点,请编辑你的问题并使其精确。PHP通常会告诉您问题在哪里,您所需要做的就是读取错误消息。是的…我改变了,但我仍然得到一个zip文件,当你打开它时,它会显示另一个zip,这似乎是一个循环,欢迎你。有时一个人负责最重要的事情;)(在阅读问题时,我也没有首先检查这一点,并且第一次看到文件大小问题。不要忘了也解决这个问题)
readfile($filename);