2013-05-28 180 views
0

我的download.php不起作用。下載完成後,打開文件的錯誤是「存檔文件已損壞或損壞」。 我不知道錯誤的原因。所以請幫助我。該代碼是一個硬代碼。我通過給出圖像的名稱來測試此代碼。它的工作原理是正確的,但是當我從數據庫中檢索圖像並嘗試運行此代碼時,出現了問題。下載錯誤....存檔文件損壞或損壞

 <?php 

echo "<br/>" , $product_id=$_REQUEST['product_id']; 
echo "<br/>" , $query= ("SELECT image_name FROM " . $db_prefix ."product WHERE image_id = $product_id"); 


$test = class_exists('ZipArchive'); 

///$url='upload_images/'; 
$url = $_SERVER['DOCUMENT_ROOT'].'photohive/upload_images/'; 

$zip = new ZipArchive; 
$zip->open($_SERVER['DOCUMENT_ROOT'].'photohive/downloads/file_' . time() . '.zip', ZipArchive::CREATE); 
$result = mysql_query($query); 
while($row= @mysql_fetch_assoc($result)) 
{ 
    //echo $url. $row['image_name']; 
    $file_name = $url.$row['image_name']; 
    if(file_exists($file_name)){ 
     //$zip->addFile($file_name); 
     //$zip->addFromString(basename($file_name), file_get_contents($file_name)); 

     $zip->addFile(realpath($file_name), $file_name); 
    } 
} 

$zip->close(); 


$encoding = 'binary'; 
$filename = $_SERVER['DOCUMENT_ROOT'].'photohive/downloads/file_' . time() . '.zip'; 
header('Pragma: public'); 
header('Expires: 0'); 
header('Content-Description: File Transfer'); 
header('Content-Disposition: filename="' . basename($filename). '"'); 
header('Content-Type: application/x-zip'); 
header('Content-Transfer-Encoding: ' . $encoding); 
header('Content-Length: ' . filesize($filename)); 

$file = readfile($filename); 

//print($file); 
exit; 




?> 
+0

? – Danack

+0

此外 - 你已經發布的代碼顯然不會工作,因爲它在例如[echo「
」] – Danack

回答

0

在你的代碼使用這個字符串來獲得兩倍的文件名:$_SERVER['DOCUMENT_ROOT'].'photohive/downloads/file_' . time() . '.zip';

在第二次,time()可能會返回不同的時間戳記,因爲有些秒會通過,而你是壓縮圖片。

同樣使用time()方法會在高流量站點上出現衝突,您可能會在一秒鐘內獲得兩個或更多請求。

我建議你使用tempnam()函數來生成文件。請記住在下載完成後刪除它。

下面是一個代碼:

$filename = tempnam($_SERVER['DOCUMENT_ROOT'].'photohive/downloads', "zip"); 
... 
$zip->open($filename, ZipArchive::OVERWRITE); 

並刪除這一行:你的第一個

$filename = $_SERVER['DOCUMENT_ROOT'].'photohive/downloads/file_' . time() . '.zip'; 

$encoding = 'binary';

+0

謝謝。它的工作現在。 – user1756650

+0

完美,請記得投票。並接受答案。 – Kostanos