Как автоматически начать загрузку в PHP?
-
09-06-2019 - |
Вопрос
Какой код нужно добавить в PHP, чтобы браузер автоматически загружал файл на локальный компьютер при посещении ссылки?
Я специально думаю о функциональности, аналогичной функциональности сайтов загрузки, которые предлагают пользователю сохранить файл на диск после нажатия на название программного обеспечения?
Решение
Перед выводом файла отправьте следующие заголовки:
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. Я не знал об этом, всегда просто использовал «application / force-download»:)
Другие советы
Вот пример отправки обратно в PDF.
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@Swish я не нашел Тип содержимого приложения / принудительной загрузки, чтобы делать что-то другое (протестировано в IE и Firefox). Есть ли причина не отправлять обратно фактический тип MIME?
Также в руководстве по PHP Хейли Уотсон опубликовано: р>
Если вы хотите принудительно загрузить и сохранить файл вместо его рендеринга, помните, что не существует такого типа MIME, как «application / force-download». Правильный тип для использования в этой ситуации - «application / octet-stream», а использование чего-либо еще просто полагается на тот факт, что клиенты должны игнорировать нераспознанные типы MIME и использовать «application / octet-stream» вместо этого (см. разделы 4.1.4 и 4.5.1 RFC 2046).
Также в соответствии с IANA не существует зарегистрированного типа приложения / типа принудительной загрузки. . р>
Чистый пример.
<?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);