Скачать zip через php

Я пытаюсь загрузить 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��

Я тоже пробовал разные заголовки, но ничего не изменилось. Код мне кажется правильным. Я надеюсь, что кто-то может мне помочь. Спасибо.

Ваш код уязвим для атак SQL-инъекция. Вместо построения запросов с конкатенацией строк всегда используйте подготовленные заявления с связанные параметры. См. Некоторые хорошие примеры в эта страница и эта почта.

Alex Howansky 05.04.2021 21:14

Вы бы увидели такое поведение, если бы у вас были какие-либо выходные данные, генерируемые до срабатывания этой функции.

Alex Howansky 05.04.2021 21:16

@AlexHowansky Спасибо за информацию! Я постараюсь это изменить. Страница перенаправляется с параметром url, а затем вызывается функция. Спасибо за быстрый ответ!

philale 05.04.2021 21:29

В ответ на один HTTP-запрос вы можете либо представить веб-контент для отображения в браузере, либо доставить файл для сохранения. Вы не можете делать и то, и другое одновременно. Страницы, на которых для этого используется появляться, используют переадресацию <meta> для запуска второго запроса на загрузку фактического файла.

Sammitch 05.04.2021 23:32

Спасибо за ваш ответ! Не могли бы вы привести пример? Мне также нужно «отправить» идентификатор на php.

philale 06.04.2021 00:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
27
1

Ответы 1

Это похоже на проблему с заголовком. Я использую эти заголовки для вывода ZIP-файла:

header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-disposition: attachment; filename='.$filename);

Вы можете попробовать. Это расширение файла, которое делает его файлом ZIP, а не заголовок Content-Type.

Я не уверен, что это поможет. Многие другие проблемы могут вызвать вашу проблему.

К сожалению, ничего не изменилось, но все равно спасибо!

philale 05.04.2021 21:33

Другие вопросы по теме