6

だから私がやろうとしているのは、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'));

これまでのところ運がありません。どんな助けでも大歓迎です。

4

3 に答える 3

9

最も重要な部分を見逃していました -ファイルを出力してください! :)

追加:

readfile('test.zip');

phpファイルの最後まで。


また、HTTP content-length ヘッダーの計算も間違っています。

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

filesize は引数としてファイル名を想定しているため、これにより常に 0 (または false) が返されます。

行を次のように変更します。

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

この両方を実行すると、zip が正常にダウンロードされ、2 つのファイルが含まれます。完全を期すために、完全な動作例を次に示します。

$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');
于 2013-03-07T00:36:47.207 に答える
1

これらすべてのheader()呼び出しの後、私はあなたが欲しいと思います:

readfile($filename); 
于 2013-03-07T00:43:56.063 に答える
1

PHP エラーがあります (おそらく、エラー レポートがオンになっていないか、エラー レベルが十分に高くありません)。

filesize() 関数は、オブジェクトではなく文字列を取ります。filesize($filename) が機能します。

エラー報告を有効にするには:

error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1);

または、php.iniでこれを行います

于 2013-03-07T00:39:51.963 に答える