2012-07-12 103 views
5

我用php壓縮文件夾和文件,但是當我嘗試打開壓縮文件時,我得到一個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()'的樣子? – 2012-07-15 21:15:15

回答

6

,並瞭解到,這兩個函數調用可以幫助:

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()調用有助於看到在發送文件之前輸出了警告。

希望在未來幫助某人。