Как автоматически начать загрузку в PHP?

Какой код нужно добавить в PHP, чтобы браузер автоматически загружал файл на локальный компьютер при переходе по ссылке?

Я специально имею в виду функциональность, аналогичную функциональности сайтов загрузки, которые предлагают пользователю сохранить файл на диск, как только вы щелкаете имя программного обеспечения?

Стоит ли изучать 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 и хотите разрабатывать...
51
0
104 576
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вот пример отправки обратно pdf.

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename = "' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);

@Swish Я не обнаружил, что тип содержимого application / force-download делает что-либо другое (проверено в IE и Firefox). Есть ли причина не отправлять обратно фактический тип MIME?

Также в руководстве по PHP Хейли Уотсон размещено:

If you wish to force a file to be downloaded and saved, instead of being rendered, remember that there is no such MIME type as "application/force-download". The correct type to use in this situation is "application/octet-stream", and using anything else is merely relying on the fact that clients are supposed to ignore unrecognised MIME types and use "application/octet-stream" instead (reference: Sections 4.1.4 and 4.5.1 of RFC 2046).

Также согласно IANA не существует зарегистрированного типа приложения / принудительной загрузки.

Он работает на ПК, но ... "Невозможно загрузить. Контент не поддерживается", когда я захожу на страницу загрузки на устройстве Android. Почему?

emeraldhieu 12.07.2012 13:42

@ Emerald214 Нет PDF Reader. Или нет ассоциации для типа содержимого PDF

grom 13.07.2012 10:38

Особенно, если целевой тип файла - .zip, и все, что вы делаете на странице, запускает загрузку файла через PHP, вы можете добавить ob_clean(); и ob_flush(); перед кодом, приведенным в ответе выше; при попытке открыть .zip изначально в Windows у меня возникла проблема, из-за которой ОС сообщала, что .zip-архивы, полученные таким образом, недействительны, хотя 7zip и другие специализированные инструменты для обработки сжатых архивных форматов могли справиться с ними отлично .

Seldom 'Where's Monica' Needy 10.07.2015 01:41
Ответ принят как подходящий

Перед выводом файла отправьте следующие заголовки:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");

@grom: Интересно насчет MIME-типа application / octet-stream. Я не знал об этом, всегда просто использовал приложение / принудительную загрузку :)

Я не совсем уверен, почему, потому что это ново для меня, но этот сценарий работал правильно, только если у меня была строка длины содержимого.

sehummel 06.08.2011 00:13

Это отлично работает, но по какой-то причине, хотя он показывает правильное имя и размер, мои загрузки случайным образом останавливаются и говорят об ошибке сети. Кто-нибудь знает, почему это происходит? Я знаю, что это не мой Wi-Fi / фактическое сетевое соединение.

Griffin Garman 10.01.2020 00:55

Чистый пример.

<?php
    header('Content-Type: application/download');
    header('Content-Disposition: attachment; filename = "example.txt"');
    header("Content-Length: " . filesize("example.txt"));

    $fp = fopen("example.txt", "r");
    fpassthru($fp);
    fclose($fp);
?>

Это может сработать, но я бы не стал называть это «чистым». Во-первых, это включает в себя ввод имени файла три раза. Вместо этого я бы установил имя файла как переменную, чтобы ваш код не был избыточным и вы уменьшили вероятность ошибок.

Mike 31.03.2016 23:47

мой код работает с расширениями txt, doc, docx, pdf, ppt, pptx, jpg, png, zip, и я думаю, что лучше явно использовать фактические типы MIME.

$file_name = "a.txt";

// extracting the extension:
$ext = substr($file_name, strpos($file_name,'.')+1);

header('Content-disposition: attachment; filename='.$file_name);

if (strtolower($ext) == "txt")
{
    header('Content-type: text/plain'); // works for txt only
}
else
{
    header('Content-type: application/'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);

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