Я пытаюсь принудительно загрузить файл в моей 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.
Любое предложение?






Я всегда находил, что точные заголовки должны быть немного беспорядочными и зависеть от браузера, есть много вариантов, и вы увидите множество опубликованных вариантов, поэтому я предлагаю следующее, но вам может потребоваться просто протестировать количество комбинаций, пока вы не поймете это правильно, и я предлагаю вам проверить его на как можно большем количестве браузеров.
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . $new_filename . "\"");
readfile($original_filename);
Большое спасибо, Смит. Я пробовал вашу комбинацию. все тот же результат. Он отлично работает с текстовыми файлами, но с пустым файлом в случае двоичного файла.
протестировано работающее локально (веб-сервер apache), бинарные и текстовые файлы. какое новое имя файла? знает ли ваш браузер, как обрабатывать этот файл? вы пробовали другой браузер? или даже компьютер?
Привет, Смит. Вы абсолютно правы. Моя ошибка. Я случайно изменил часть исходного имени файла в процессе обновления моего файла предложенной комбинацией. Таким образом, файл не удалось найти, и был загружен файл с нулевым объемом. Я исправил имя файла, и теперь он работает нормально. Большое спасибо.
заголовок ("Content-Type: application / octet-stream"); попробуйте добавить этот заголовок