2014-06-18 193 views
0

我想從本地服務器上下載一個zip文件到HD。PHP下載.zip文件,但不正確

$zip = new ZipArchive; 
$zip->open($archive, ZipArchive::CREATE); 

$files = scandir($dir); 
unset($files[0], $files[1]); 
foreach ($files as $file) { 
$zip->addFile($dir.'/'.$file); 
} 
$zip->close(); 
$download=$archive; 
header("Content-Disposition: attachment; filename=\"Reports". $stocktake_id. ".zip"); 
header("Pragma: public"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

該文件被下載,但其大小不正確,並且打不開,說格式無效或文件已損壞。

+0

你檢查過你是否正在獲取數據,什麼是$文件? –

+0

你的代碼只設置標題,所以我們假設輸出實際上是空的? –

+0

壓縮文件得到正確生成,因爲我可以在本地服務器上檢查它。我想能夠自動下載的原因是我們公司的dum-dums不知道如何從服務器獲取文件。 – ArtleMaks

回答

0

我認爲你缺少內容類型的標題。 另外,我沒有看到你回傳給客戶的原始數據? 並確保沒有調試輸出或任何不在文件本身中的東西。

//After you saved your file: 

download_file_to_client($saved_file); 
exit; 

function download_file_to_client($file, $mime = 'application/zip') 
{ 
    $filesize = filesize($file); 
    header('Content-Type: '.$mime.';charset=utf-8'); 
    header('Content-Disposition: attachment;filename="some-filename.zip"'); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    header('Content-Length: ' . $filesize); 
    flush(); // Get the headers out immediately to prevent any delay in some browsers. 

    $fh = fopen($file, "r"); 
    while ($fh && !feof($fh)) 
    { 
     echo fread($fh, 8192); 
    } 
    fclose($fh); 
} 
+0

當我嘗試這個時,它似乎永遠循環?我認爲它取決於文件的大小,但zip文件只有287kb,所以我不希望它花費那麼長時間? 只要可以肯定,下載對話框應該像平時下載一樣彈出是嗎? – ArtleMaks

+0

這意味着文件指針$ fh不是一個正確的指針。 請var_dump $ fh,看看它是否是一個資源ID。如果不是,則表示$文件路徑無法通過$文件傳遞。 我添加了一些錯誤處理功能.. – twicejr

+0

嘗試使用絕對路徑,看看會發生什麼? – twicejr