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






Вот пример отправки обратно 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 не существует зарегистрированного типа приложения / принудительной загрузки.
@ Emerald214 Нет PDF Reader. Или нет ассоциации для типа содержимого PDF
Особенно, если целевой тип файла - .zip, и все, что вы делаете на странице, запускает загрузку файла через PHP, вы можете добавить ob_clean(); и ob_flush(); перед кодом, приведенным в ответе выше; при попытке открыть .zip изначально в Windows у меня возникла проблема, из-за которой ОС сообщала, что .zip-архивы, полученные таким образом, недействительны, хотя 7zip и другие специализированные инструменты для обработки сжатых архивных форматов могли справиться с ними отлично .
Перед выводом файла отправьте следующие заголовки:
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. Я не знал об этом, всегда просто использовал приложение / принудительную загрузку :)
Я не совсем уверен, почему, потому что это ново для меня, но этот сценарий работал правильно, только если у меня была строка длины содержимого.
Это отлично работает, но по какой-то причине, хотя он показывает правильное имя и размер, мои загрузки случайным образом останавливаются и говорят об ошибке сети. Кто-нибудь знает, почему это происходит? Я знаю, что это не мой Wi-Fi / фактическое сетевое соединение.
Чистый пример.
<?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);
?>
Это может сработать, но я бы не стал называть это «чистым». Во-первых, это включает в себя ввод имени файла три раза. Вместо этого я бы установил имя файла как переменную, чтобы ваш код не был избыточным и вы уменьшили вероятность ошибок.
мой код работает с расширениями 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);
Он работает на ПК, но ... "Невозможно загрузить. Контент не поддерживается", когда я захожу на страницу загрузки на устройстве Android. Почему?