Имеется кнопка скачать на клиенте, по нажатию на которую уходит запрос на сервер с целью получения файла для скачивания.
Примерно так:
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 использовать запрещается.
Есть скрипт что пытается определить кодировку и сменить на WINDOWS-1251Вот основной кусок: