40

local-server で zip ファイルを作成して 2 つのファイルをダウンロードしようとしています。ファイルは zip 形式でダウンロードされますが、解凍しようとするとエラーが発生します: End-of-central-directory signature not found. このファイルは zip ファイルではないか、マルチパート アーカイブの 1 つのディスクを構成しています。後者の場合、中央ディレクトリと zip ファイルのコメントは、このアーカイブの最後のディスクにあります。

私がこれに使用している次のコード:

 <?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');

//Archive name
$archive_file_name=$name.'iMUST_Products.zip';

//Download Files path
$file_path=$_SERVER['DOCUMENT_ROOT'].'/Harshal/files/';


zipFilesAndDownload($file_names,$archive_file_name,$file_path);

function zipFilesAndDownload($file_names,$archive_file_name,$file_path)
{
        //echo $file_path;die;
    $zip = new ZipArchive();
    //create the file and throw the error if unsuccessful
    if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) {
        exit("cannot open <$archive_file_name>\n");
    }
    //add each files of $file_name array to archive
    foreach($file_names as $files)
    {
        $zip->addFile($file_path.$files,$files);
        //echo $file_path.$files,$files."

    }
    $zip->close();
    //then send the headers to force download the zip file
    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=$archive_file_name"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$archive_file_name");
    exit;
}




?>

関数に渡されるすべての変数の値を確認しましたが、すべて問題ありません。これを見てください。よろしくお願いします。

4

7 に答える 7

54

Content-lengthzip ファイルのサイズをバイト単位で説明するヘッダーを追加します。

header("Content-type: application/zip"); 
header("Content-Disposition: attachment; filename=$archive_file_name");
header("Content-length: " . filesize($archive_file_name));
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile("$archive_file_name");

<?また、 の前後に空白がないようにして?>ください。ここにスペースがあります:

↓</p>

 <?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');
于 2012-09-01T08:06:44.503 に答える
10
$zip = new ZipArchive;
$tmp_file = 'assets/myzip.zip';
    if ($zip->open($tmp_file,  ZipArchive::CREATE)) {
        $zip->addFile('folder/bootstrap.js', 'bootstrap.js');
        $zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js');
        $zip->close();
        echo 'Archive created!';
        header('Content-disposition: attachment; filename=files.zip');
        header('Content-type: application/zip');
        readfile($tmp_file);
   } else {
       echo 'Failed!';
   }
于 2016-01-12T06:47:10.773 に答える
6
// http headers for zip downloads
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($filepath.$filename));
ob_end_flush();
@readfile($filepath.$filename);

ここでこの解決策を見つけましたが、それは私にとってはうまくいきます

于 2015-06-13T22:40:24.973 に答える
5

エラーの 1 つは、ファイルが「アーカイブ」形式として読み取られていないことです。ZipArchive がファイルを開けないことを確認してください- エラー コード: 19 。ダウンロードしたファイルをテキスト エディターで開きます。先頭に html タグまたはデバッグ ステートメントがある場合は、ファイルを読み取る前にバッファーをクリアします。

ob_clean();
flush();
readfile("$archive_file_name");
于 2015-06-24T01:06:22.670 に答える
3

私はちょうどこの問題に遭遇しました。私にとって問題は次のとおりでした:

readfile("$archive_file_name");

メモリ不足エラーが発生していました。

Allowed memory size of 134217728 bytes exhausted (tried to allocate 292982784 bytes)

readfile() を次のものに置き換えることで、問題を修正できました。

    $handle = fopen($zipPath, "rb");
    while (!feof($handle)){
        echo fread($handle, 8192);
    }
    fclose($handle);

これが同じ問題なのか、それともファイルが 1.2 MB しかないことに気付いていないのかは不明です。たぶん、これは同様の問題を抱えている他の誰かを助けるでしょう。

于 2014-10-09T02:02:19.670 に答える
1

私はまったく同じ問題を経験しました。私の場合、そのソースは、すべて読み取り専用に設定されたzipファイルを作成したいフォルダーのアクセス許可でした。読み書きできるように変更したところ、うまくいきました。

スクリプトを実行したときにローカル サーバーにファイルが作成されていない場合は、おそらく私と同じ問題が発生しています。

于 2013-09-16T03:04:41.183 に答える
0

しかし、ダウンロード後にサーバーから取得しているファイルのサイズは226バイトです

これは ZIP ヘッダーのサイズです。ダウンロードしたZIPファイルにはデータがないようです。では、ZIP ファイルに追加されるファイルが実際にそこにあることを確認できますか (ダウンロード PHP スクリプトのパスに対して)。

チェックを追加することも検討してくださいaddFile

foreach($file_names as $file)
{
    $inputFile = $file_path . $file;
    if (!file_exists($inputFile))
        trigger_error("The input file $inputFile does not exist", E_USER_ERROR);
    if (!is_readable($inputFile))
        trigger_error("The input file $inputFile exists, but has wrong permissions or ownership", E_USER_ERROR);
    if (!$zip->addFile($inputFile, $file))
        trigger_error("Could not add $inputFile to ZIP file", E_USER_ERROR);
}

観察された動作は、ファイルが ZIP ファイルに追加されない問題 (パス エラー、権限の問題など) と一致しています。「空の」ZIP ファイルを受信すると、クライアントは、ZIP セントラル ディレクトリが見つからないことを示すエラーを発行します (実際のエラーは、ディレクトリもファイルも存在しないことです)。

于 2012-09-01T10:48:03.247 に答える