2012-07-12 6 views
5

私はフォルダとファイルをPHPで圧縮していますが、zipファイルを開こうとすると代わりにcpgzファイルが表示されます。そのファイルを解凍した後、私は別のzipファイルを取得します。それは、現在のフォルダをベーススキャンしてファイルとフォルダをスキャンして圧縮することです。 これは私が使用するコードです:PHPで圧縮されたファイルは、抽出後にcpgzファイルになります

function Zip($source, $destination) 
{ 
if (!extension_loaded('zip') || !file_exists($source)) { 
    return false; 
} 

$zip = new ZipArchive(); 
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { 
    return false; 
} 

$source = str_replace('\\', '/', realpath($source)); 

if (is_dir($source) === true) 
{ 
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 

    foreach ($files as $file) 
    { 
     $file = str_replace('\\', '/', realpath($file)); 

     if (is_dir($file) === true) 
     { 
      $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); 
     } 
     else if (is_file($file) === true) 
     { 
      $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); 
     } 
    } 
} 
else if (is_file($source) === true) 
{ 
    $zip->addFromString(basename($source), file_get_contents($source)); 
} 

return $zip->close(); 
} 


if($_GET["archive"]== 'true'){ 
$date = date("Ymd_Hi"); 
$dir = dirname(__FILE__); 
$filename = $date.".zip"; 

Zip(getcwd(), $filename); 

header("Content-disposition: attachment; filename=$filename"); 
header('Content-type: application/zip'); 
readfile($filename); 
unlink($filename); 
} 
+0

- @ Stevenは、アプリケーションコードと同じサーバー上のzipファイルですか?私は私が[ここで解決した]まったく同じ問題を抱えていました(http://stackoverflow.com/questions/11495103/opening-downloaded-zip-file-creates-cpgz-file)。また、あなたは 'header() 'のように見えますか? –

答えて

6

私はまったく同じ問題を抱えていた、そしてこれら二つの関数呼び出しを助けることができることを学びました:通常のContent-処分とのContent-Lengthを設定

header("Content-disposition: attachment; filename=$filename"); 
header('Content-type: application/zip'); 

// Add these 
ob_clean(); 
flush(); 

readfile($filename); 
unlink($filename); 

PHPでヘッダを設定する前にアウトプットが誤って送信された場合、PHPのアウトプットバッファとその下にあるアウトプットバッファ(Apacheなど)をフラッシュするだけで十分です。

私の場合、header()とreadfile()のデバッグのためのコメントアウトは、ファイルが送信される前に警告が出力されるのを助けました。

今後誰かを助ける希望。

関連する問題