7

私はこのコードを持っています

<?php
$files = array('includes/s.xlsx', 'includes/test.html');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
 }
$zip->close();


header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=filename.zip');
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

ただし、zipファイルをサーバーに保存したくないので、ユーザーに提供したいだけです。

4

3 に答える 3

8

ZIPはストリーミング可能な形式ではありません(ターゲットはシークをサポートする必要があります。つまり、以前に書き込まれたデータを再読み取りおよび変更できないターゲットにZIPファイルを単純に書き込むことはできません)、実行しようとしていることは機能しません。したがって、最善の解決策(zipファイルが巨大でない場合)は、一時的な場所に作成してからreadfile()、一時ファイルを削除することです。

詳細については、次のStackOverflowの質問を参照してください。それらには、あなたにとって問題ないかもしれないいくつかの回避策が含まれています:

于 2012-12-17T14:37:59.523 に答える
5

後にこれを追加してみてくださいreadfile($zipname);

// delete the file from the server
unlink($zipname);
exit;
于 2014-01-24T14:21:09.087 に答える
3

オブジェクト$zipを使用してzipファイルを開いて変更していますが、filesize()ファイルreadfile()名のみを処理するため、次のようにする必要があります。

header('Content-Length: ' . filesize($zipname));
readfile($zipname);

ところで、tempnam()zipコンテンツを保持するために使用される「一時」ファイルを生成するために使用できます。一度readfile()行われると、あなたはまだそれをしなければunlink()なりません。

于 2012-12-17T14:40:39.377 に答える