7

次のコードでエラーなしでzipファイルをダウンロードしていますが、ダウンロードしたzipファイルが空であるか破損しており、サイズは常に約200バイトです。つまり、そのzipファイルを開くことができません。また、ZipArchive :: getStatusString()にも「エラーなし」と表示されます

コードは:

public function getzip(){
    global $config;
    $files=array();
    if(isset($_COOKIE['hashes'])){
        $hashes=explode(',',$_COOKIE['hashes']);
        for ($i=0; $i <count($hashes); $i++) {
            array_push($files,$config["domain"]."/download/".$hashes[$i]); 
        }
    }
    if(count($files)){
        $zipname='basket.zip';
        $zip = new ZipArchive;
        $zip->open($zipname,ZipArchive::CREATE);
        foreach ($files as $key=>$value ) {
            $zip->addFile($value);
        }
        $status=$zip->getStatusString();
        $zip->close();

    if(!$zipname)
    {
        echo "Nothing in Basket";
    }
    else
    {   header('Content-Description: File Transfer');
        header('Content-Type: application/zip');
        header('Content-Disposition:attachment; filename='.basename($zipname));
        header('Content-Length:'.filesize($zipname));
        readfile($zipname);
    }
}
4

7 に答える 7

5

直前に完全なファイル パスと名前を取得してみてください$zip->close();

$filename = $zip->filename;

$zipnameファイルを読み取ってファイルサイズを取得するときの代わりにそれを使用します

于 2013-02-09T22:21:41.887 に答える
3

これは私の最善の推測です。ここで間違っているのは、配列$filesに保存している値がおそらくファイルへの実際のパスではないということです。

注意: URL を に渡すことはできません$zip->addfile()。実際のファイルが必要です。

于 2013-02-10T12:29:26.930 に答える
1

この質問を理解するのは難しいですが、破損した zip がどのように作成されるかを発見したことを投稿します。

zip アーカイブを作成する場合、echo/print_r コマンドを使用してデバッグすることがよくあります。これらをクリアしないと、出力 zip ファイルが破損します。

質問に基づく例:

public function getzip(){
    global $config;
    $files=array();
    if(isset($_COOKIE['hashes'])){
        $hashes=explode(',',$_COOKIE['hashes']);
        for ($i=0; $i <count($hashes); $i++) {
            array_push($files,$config["domain"]."/download/".$hashes[$i]); 
        }
    }
    if(count($files)){
        $zipname='basket.zip';
        $zip = new ZipArchive;
        $zip->open($zipname,ZipArchive::CREATE);
        foreach ($files as $key=>$value ) {
            $zip->addFile($value);
        }
        $status=$zip->getStatusString();
        $zip->close();

    if(!$zipname)
    {
        echo "Nothing in Basket";
    }
    else
    {   
        // to fix your corrupt zip file, remove this line.
        echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname;
        header('Content-Description: File Transfer');
        header('Content-Type: application/zip');
        header('Content-Disposition:attachment; filename='.basename($zipname));
        header('Content-Length:'.filesize($zipname));
        readfile($zipname);
    }
}
于 2013-08-26T10:45:42.247 に答える
1

同様の問題で数時間を費やしたばかりなので、元の問題は解決されましたが、このスレッドに追加します。

$zip->addFile() を使用してファイルを追加するタイミングに関係なく、$zip->close() を実行するときにすべてのファイルが存在する必要があることがわかります。

そのため、一時ファイルを作成して zip に追加し、close() を使用する前にそれらを削除すると、アーカイブが空または破損する可能性があります。

于 2017-03-02T15:33:47.913 に答える