Я хочу, чтобы пользователь мог загружать некоторые файлы, которые у меня есть на моем сервере, но когда я пытаюсь использовать любой из многих примеров этого в Интернете, ничего не работает для меня. Я пробовал код следующим образом:
<?php $size = filesize("Image.png"); header('Content-Description: File Transfer'); header('Content-Type: image/png'); header('Content-Disposition: attachment; filename="Image.png"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size); readfile("Image.png");
Я даже пытался использовать самый простой пример, который я мог бы найти, например:
<?php header('Content-type: image/png'); header('Content-Disposition: attachment; filename="Image.png"'); readfile('Image.png');
Когда я протестировал это, я удалил весь другой код, который у меня есть, и использовал пустой файл только с этим кодом, чтобы удалить любые ошибки, созданные внешними источниками.
Когда я смотрю в консоль, файл отправляется с правильными заголовками, т. Е.
'Content-Disposition: attachment; filename="Image.png"'
Но диалог сохранения не отображается.
Я также пробовал использовать inline вместо вложения в заголовке вывода контента, но это тоже не имело значения. Я протестировал это в Firefox 8.0.1 Chrome 15.0.874.121 и Safari 5.1.1.
Я уверен, что вы не добавляете тип mime как JPEG при загрузке файлов:
header('Content-Type: image/png');
Эти заголовки никогда не подводили меня:
$quoted = sprintf('"%s"', addcslashes(basename($file), '"\\')); $size = filesize($file); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $quoted); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size);
Проблема заключалась в том, что я использовал ajax для отправки сообщения на сервер, когда я использовал прямую ссылку для загрузки файла, все работало нормально.
Вместо этого я использовал этот другой материал Q & A Stackoverflow, он отлично работал для меня:
Это работало для меня как шарм для загрузки PNG и PDF.
header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file_url)); //Absolute URL ob_clean(); flush(); readfile($file_url); //Absolute URL exit();
его работа для меня
$attachment_location = "filePath"; if (file_exists($attachment_location)) { header($_SERVER["SERVER_PROTOCOL"] . " 200 OK"); header("Cache-Control: public"); // needed for internet explorer header("Content-Type: application/zip"); header("Content-Transfer-Encoding: Binary"); header("Content-Length:".filesize($attachment_location)); header("Content-Disposition: attachment; filename=filePath"); readfile($attachment_location); die(); } else { die("Error: File not found."); }