Загрузка файла с помощью php с помощью заголовка ()

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

<?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, он отлично работал для меня:

  • Загрузка файла Ajax с использованием JQuery, PHP

Это работало для меня как шарм для загрузки 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."); }