Загрузка файла на php не работает для pdf, но работает для текстовых файлов

Я пытаюсь принудительно загрузить файл в моей php-программе под новым именем (new_name). Я меняю имя файла, но сохраняю расширение, такое же, как у обычного файла. Это часть моего кода:

$original_filename = "attachments/20180315.log";
$new_filename = "new_name." . pathinfo($original_filename, PATHINFO_EXTENSION);
header("Content-Length: " . filesize($original_filename));
header("Content-Transfer-Encoding: binary");
header('Content-Disposition: attachment; filename = "' . $new_filename . '"');
header('Pragma: no-cache'); 

readfile($original_filename);
exit;           

Моя загрузка работает нормально, когда я загружаю текстовый файл (например, в приведенном выше примере 20180315.log - это текстовый файл). Когда я пытаюсь сделать то же самое с двоичным файлом (например, pdf), я получаю пустой new_name.pdf.

Любое предложение?

заголовок ("Content-Type: application / octet-stream"); попробуйте добавить этот заголовок

Meow Kim 16.03.2018 03:50
Стоит ли изучать 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
1
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . $new_filename . "\""); 
readfile($original_filename); 

Большое спасибо, Смит. Я пробовал вашу комбинацию. все тот же результат. Он отлично работает с текстовыми файлами, но с пустым файлом в случае двоичного файла.

Amir-M 16.03.2018 03:06

протестировано работающее локально (веб-сервер apache), бинарные и текстовые файлы. какое новое имя файла? знает ли ваш браузер, как обрабатывать этот файл? вы пробовали другой браузер? или даже компьютер?

user9487972 16.03.2018 03:45

Привет, Смит. Вы абсолютно правы. Моя ошибка. Я случайно изменил часть исходного имени файла в процессе обновления моего файла предложенной комбинацией. Таким образом, файл не удалось найти, и был загружен файл с нулевым объемом. Я исправил имя файла, и теперь он работает нормально. Большое спасибо.

Amir-M 16.03.2018 03:51

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