2012-07-12 34 views
5

Tôi đang nén thư mục và tệp bằng php, nhưng khi tôi cố gắng mở tệp zip, tôi sẽ nhận tệp cpgz thay thế. Sau khi giải nén tập tin đó tôi nhận được một tập tin zip. Những gì nó làm là bassicaly quét thư mục hiện tại cho các tập tin và thư mục để zip. Đây là mã tôi sử dụng:Tệp đã nén với kết quả PHP trong tệp cpgz sau khi trích xuất

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, là tệp zip của bạn trên cùng một máy chủ với mã ứng dụng của bạn? Tôi đã có cùng một vấn đề chính xác mà tôi [đã giải quyết ở đây] (http://stackoverflow.com/questions/11495103/opening-downloaded-zip-file-creates-cpgz-file). Ngoài ra, bạn 'header() 'trông như thế nào? –

Trả lời

6

Tôi chỉ có chính xác cùng một vấn đề, và biết được rằng hai chức năng cuộc gọi có thể giúp:

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

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

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

Thông thường thiết lập Content-Disposition và Content-Length nên là đủ, tuy nhiên xả bộ đệm đầu ra của PHP và bộ đệm đầu ra cơ bản (Apache hoặc như vậy) sẽ giúp khi đầu ra vô tình được gửi trước khi các tiêu đề được đặt trong PHP.

Trong trường hợp của tôi, nhận xét các cuộc gọi tiêu đề() và readfile() để gỡ lỗi đã giúp xem, cảnh báo đó được xuất trước khi tệp được gửi.

Hy vọng rằng sẽ giúp ai đó trong tương lai.

Các vấn đề liên quan