2013-02-09 4 views
6

次のコードでZipファイルをダウンロードしていますが、ダウンロードしたzipファイルは空でも破損しています。サイズは常に約200バイトです。 つまり、そのzipファイルを開くことができません。ZipArchiveで破損した空のジップを取得する

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); 
    } 
} 
+0

それは私に偽を与えます。つまり、$ zipnameのディレクトリは作成されません。 しかし、 "バスケットには何もない"というメッセージが表示されず、代わりにzipファイルがダウンロードされています。 –

答えて

3

これは私の推測です。ここで間違っているのは、配列$filesに格納されている値が実際のファイルパスではないことです。

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

あなたは、多くの場合、エコー/しますprint_rコマンドでデバッグしますzipアーカイブを作成する場合:

5

だけ$zip->close();

$filename = $zip->filename; 

前に、完全なファイルパスと名前を取得してみて、それを使用します。)また、:: ZIPARCHIVE getStatusString( も ​​"エラーなし"

コードはありません表示されますファイルを読み込んでファイルサイズを取得するときに$zipnameの代わりに

+0

@ポニーこれもチェックしてください..まだ同じ問題が発生しています。 ファイルのディレクトリが作成されていないと思います。 また、 'var_dump($ filename)'が正確なパスを示していることを確認しました。 –

+0

'$ zip-> close()'を呼び出す前にこの変数を割り当てましたか? –

+0

チャームのように働いた!ありがとう:) – Scott

0

さえ厳しいこの質問は私が作成することができますか破損したジッパー見つけたものを掲載します、考え出してきました。これらをクリアしないと、出力された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); 
    } 
} 
1

私は同様の問題で数時間を過ごしたので、元の問題が解決されているにもかかわらず、このスレッドに追加します。

$ zip-> addFile()を使用してファイルを追加するときに関係なく、$ zip-> close()を実行するときに必要なファイルがすべて表示されます。

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

0

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

関連する問題