Я пытаюсь загрузить zip-файл через php. Имя файла хранится в базе данных, а все файлы хранятся в папке с именем «продукты». Это код, который я использую:
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% ���7 <�MP���, _���S�3�> M�9�> ǩ_�V��ᯇ.� iUι�a����F�K� ڦ éc�9�� ܗ ki�KK�u�� \ �u�F 䨪 ���b������3��q��� ָ ~ � e \ o� ���: G�U�q��K���V��
Я тоже пробовал разные заголовки, но ничего не изменилось. Код мне кажется правильным. Я надеюсь, что кто-то может мне помочь. Спасибо.
Вы бы увидели такое поведение, если бы у вас были какие-либо выходные данные, генерируемые до срабатывания этой функции.
@AlexHowansky Спасибо за информацию! Я постараюсь это изменить. Страница перенаправляется с параметром url, а затем вызывается функция. Спасибо за быстрый ответ!
В ответ на один HTTP-запрос вы можете либо представить веб-контент для отображения в браузере, либо доставить файл для сохранения. Вы не можете делать и то, и другое одновременно. Страницы, на которых для этого используется появляться, используют переадресацию <meta> для запуска второго запроса на загрузку фактического файла.
Спасибо за ваш ответ! Не могли бы вы привести пример? Мне также нужно «отправить» идентификатор на php.






Это похоже на проблему с заголовком. Я использую эти заголовки для вывода ZIP-файла:
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-disposition: attachment; filename='.$filename);
Вы можете попробовать. Это расширение файла, которое делает его файлом ZIP, а не заголовок Content-Type.
Я не уверен, что это поможет. Многие другие проблемы могут вызвать вашу проблему.
К сожалению, ничего не изменилось, но все равно спасибо!
Ваш код уязвим для атак SQL-инъекция. Вместо построения запросов с конкатенацией строк всегда используйте подготовленные заявления с связанные параметры. См. Некоторые хорошие примеры в эта страница и эта почта.