У меня есть код загрузки файла на моем сайте, который отлично работал, пока я не изменил домен. Я проверил все ссылки и изменил все, и они работают FINE. По какой-то причине файл загружается поврежденным, и я не могу понять, почему.
Код:
header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$fileName.'"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_url)); readfile($file_url); exit;
$ FileName имеет имя + расширение. $ file_url работает нормально. если я повторяю URL-адрес и пытаюсь перейти к нему, я вижу файл.
Любая помощь кому-то?
EDIT: я заметил, что браузер говорит: «Ресурс» интерпретируется как «Документ», но передается с типом MIME image / png
Если загружаемые файлы являются изображениями (как указано в комментариях), заголовок Content-Type
должен быть соответствующим типом mime для этого изображения, например. «image / jpeg», «image / png» и т. д.
$size = getimagesize($file_url); header("Content-type: {$size['mime']}");
«application / octet-stream» не должен использоваться в этом экземпляре (часто использовался в прошлом, чтобы попытаться принудительно загрузить, поскольку браузер не обязательно знает, что с ним делать). Заголовок «Content-Disposition: attachment» является тем, что запускает загрузку.
Кроме того, вы указываете, что исходное имя файла находится на иврите … Заголовок «filename =» должен указывать имя файла в US-ASCII для совместимости. UTF-8 возможен, но только с некоторыми дополнительными «беспорядками» и, возможно, не совместим с некоторыми браузерами.
EDIT # 1
Если вы используете буферизацию вывода, вам может потребоваться убедиться, что выходной буфер пуст и сброшен, прежде чем пытаться загрузить файл, иначе все, что находится в выходном буфере, станет частью вашего загруженного файла, и оно будет повреждено.
header('Content-Length: ' . filesize($file_url)); ob_clean(); // <<<< flush(); // <<<< readfile($file_url);
EDIT # 2 – Content-Type
Следуя вашей ссылке на ответ на этот другой вопрос, который предлагает использовать приложение / октет-поток вместо изображения / jpg … ответ в этом вопросе цитирует RFC 2616 , однако это было заменено RFC 6266, где указано:
Согласно RFC 2616, тип привязки типа «привязка» применяется только к содержимому типа «application / octet-stream». Это ограничение было удалено, так как получатели на практике не проверяют тип содержимого, а также препятствуют правильному объявлению типа носителя.
Итак, правильнее указать правильный тип mime для изображения (как упоминалось выше). Хотя, в конце концов, важно то, что работает для вас, поскольку серверы / браузеры различаются и не обязательно соответствуют стандартам, к сожалению.
Чтобы дополнительно создать аргумент для указания правильного типа mime и не использовать «application / octet-stream», см. Следующий принятый ответ на вопрос о веб-мастерах …
Что может заставить Chrome загружать файлы?