bugfix> php > 投稿

エラーなしで次のコードで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);
    }
}

回答 5 件
  • これが私の推測です。ここで問題なのは、配列 $files  保存している値は、おそらくファイルへの実際のパスではありません。

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

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

    $filename = $zip->filename;
    
    

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

  • この質問が理解できなかったとしても、壊れた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);
        }
    }
    
    

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

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

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

  • Zipアーカイブに追加したいファイルが配置されていた同じフォルダーにコードを移動することで、同じ問題を解決しました。

あなたの答え