通过php下载zip

通过php下载zip,php,sql,file,download,zip,Php,Sql,File,Download,Zip,我正试图通过php下载一个zip文件。文件名存储在数据库中,所有文件都存储在名为“products”的文件夹中。这是我正在使用的代码: function downloadProduct($id, $connection){ $sql = "SELECT filename FROM productdata WHERE id = '$id'"; $query = mysqli_query($connection, $sql); if(mysqli_num_

我正试图通过php下载一个zip文件。文件名存储在数据库中,所有文件都存储在名为“products”的文件夹中。这是我正在使用的代码:

function downloadProduct($id, $connection){
    $sql = "SELECT filename FROM productdata WHERE id = '$id'";
    $query = mysqli_query($connection, $sql);
    if(mysqli_num_rows($query) == 1){
        $file = basename(mysqli_fetch_assoc($query)["filename"]);
        $filePath = "products/" . $file;
        if(file_exists($filePath)){
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-Disposition: attachment; filename=$file");
            header("Content-Type: application/zip");
            header("Content-Transfer-Encoding: binary");

            readfile($filePath);
            exit;
        }
        echo("<script>alert('This file (' + '$file' + ') does not exist.')</script>");
    }
    else{
        echo("<script>alert('Can not download this file.')</script>");
    }
}
函数下载产品($id,$connection){
$sql=“从productdata中选择文件名,其中id='$id';
$query=mysqli\u query($connection,$sql);
if(mysqli_num_rows($query)==1){
$file=basename(mysqli_fetch_assoc($query)[“filename”]);
$filePath=“products/”$file;
如果(文件_存在($filePath)){
标头(“缓存控制:公共”);
标题(“内容描述:文件传输”);
标题(“内容处置:附件;文件名=$file”);
标题(“内容类型:应用程序/zip”);
标题(“内容传输编码:二进制”);
readfile($filePath);
出口
}
echo(“警报('此文件('+'$file'+')不存在')”;
}
否则{
echo(“警报('无法下载此文件')”);
}
}
文件路径总是正确的(当我提醒它时),但当文件被读取时,它不会停止在我的页面底部显示以下字符:


.我*��9UZ��3.�8s�A.��U�[深圳]���~������x�����9和NU�”“一百万加元��.��^��N���U�ַΣ�<代码>p�hc��K��B�>�Sզ� 这看起来像是标题问题。我使用以下标题输出ZIP文件:

header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-disposition: attachment; filename='.$filename);
你可以试试看。正是文件的扩展名使其成为ZIP文件,而不是
内容类型
标题


我不确定这是否有用。许多其他问题可能会导致您的问题。

您的代码容易受到攻击。请始终使用with,而不是使用字符串连接生成查询。有关一些好的示例,请参见和。如果在该函数启动之前生成了任何输出,您就会看到这种行为。@AlexHowansky感谢您提供的信息!我会试着改变它。使用url参数重定向页面,然后调用函数。谢谢你的快速回答!作为对单个HTTP请求的响应,您可以向浏览器显示web内容,也可以传递要保存的文件。你不能同时做这两件事。似乎这样做的页面使用
重定向来触发第二个下载实际文件的请求。感谢您的回答!你能举个例子吗?我还需要“张贴”到php的id。不幸的是,它没有改变任何东西,但无论如何谢谢你!