Загрузка файла вместо просмотра

689
07 февраля 2017, 23:00

Имеется кнопка скачать на клиенте, по нажатию на которую уходит запрос на сервер с целью получения файла для скачивания.

Примерно так:

let xhr = new XMLHttpRequest();
xhr.open('POST', 'download.php');
xhr.send(JSON.stringify({ src: '/path/to/image/' }));

Передали мы на сервер путь к файлу, который хотим скачать, например.

Теперь на сервере получаем путь и формируем ответ:

  $str_json = json_decode(file_get_contents('php://input'));
  $filename = dirname(__FILE__) . str_replace('/', '\\', $str_json->src);
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename=' . basename($filename));
  header('Content-Length: ' . filesize($filename));
  readfile($filename);

По идее, заголовком Content-Disposition мы говорим браузеру, как ему следует обрабатывать содержимое сообщения: не отображать, а начать скачивание. Но, по какой-то причине, скачивание не начинается, а клиенту от сервера в ответе приходит следущее:

PNG IHDRÝ¡ IDATxìÁA"%A÷@¯A÷?¦ì¥~b|ZéÇ ´H3ÿ÷ÿ·âÇ?þóüúúR?~üøOª¿¾¾Ôÿùÿ¹Ýn?~üøñ£¾ßïÿû¿ÿóëëë8Çãq»Ý*~üøñã?F}¿ßßßß~}}Çq¿ßo·¿UʪU«TV¨¬ PY ²@eUʪU*«TV¨¬ .................

P.s. Аттрибут download HTML5 использовать запрещается.

READ ALSO
Вложенный цикл в шаблонизаторе Smarty

Вложенный цикл в шаблонизаторе Smarty

Имеется следующий нетривиальный PHP-код:

608
Пересобрать массив PHP

Пересобрать массив PHP

Всем привет! Есть массив foreach($products as $ val) {}:

723
PHP определение кодировки

PHP определение кодировки

Есть скрипт что пытается определить кодировку и сменить на WINDOWS-1251Вот основной кусок:

651
Ajax игнорирует файл

Ajax игнорирует файл

Проект на LaravelЕсть форма с загрузкой файла

494