问题描述
我正在尝试通过 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>");
}
}
文件路径总是正确的(当我提醒它时),但是当文件被读取时,它不会停止在我的页面底部显示这些字符:
.I*��9UZ��3�8s�A��u�sz]���~������x�����9&NU�""c$M��.�� ^��N���U�ַΣ�p�hc��K��b�>�Sզ�<��k��l��rofz
~���ۛ9�[��͜���֡�\�n�z�y��϶T�W�;� ᧔e ���{qO #m�/�#�L�=�a�_��e��l)5�e�q�&�#��g��s-������{L |i�[8�ZV�|v+�\��G���I�iDShS�g�n(7���� W���˛������T�k�p�K� ��/]�^��7��,Uwf�Z Ѽ�" U�� �L\T%���7M� 9�>ǩ_ �V��ᯇ.�iUι�a����F�K�ڦéc�9��䗗ki�KK�u��\�u�F䨪���b����� �3��q���ָ~�e\o����:G�U�q��K�� �V��
我也尝试了不同的标题,但没有任何改变。代码对我来说似乎是正确的。我希望有一个人可以帮助我。谢谢。
解决方法
这看起来像是标题问题。我将这些标头用于 ZIP 文件的输出:
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-disposition: attachment; filename='.$filename);
你可以试试看。是文件的扩展名使其成为 ZIP 文件,而不是 Content-Type
标头。
我不确定这会有所帮助。许多其他问题可能会导致您的问题。