下载错误....存档文件已损坏或损坏

时间:2013-05-28 23:03:22

标签: php

我的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;




 ?>

1 个答案:

答案 0 :(得分: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';

之后