PHP-скрипт для загрузки файла, не работающего в IE

У меня есть скрипт, который берет ключ из $ _GET ['key'], просматривает местоположение в базе данных и использует файл read вместе с некоторыми заголовками, чтобы представить загрузку для использования. Это работает в Firefox, но не в IE8, не удалось проверить его на другом IE. Я получаю следующую ошибку в IE: «Internet Explorer не может загрузить download.php с www.example.com». Как будто он пытается загрузить скрипт PHP.

$the_query = "SELECT * FROM `files` WHERE `user_id`=" . $_SESSION['user_id'] . " AND `key`='" . $key . "'"; $result = mysql_query($the_query); $row = mysql_fetch_array($result); $file = '/var/www/vhosts/www.example.com/httpsdocs/uploads/' . $row['id'] . '/' . $row['file']; header("Content-type: application/octet-stream"); header("Content-length: ".filesize($file)); header('Content-Description: File Transfer'); header("Cache-control: private"); header('Content-Disposition: attachment; filename=' . rawurlencode(basename($file))); readfile($file); 

Чтобы решить эту ошибку: «Internet Explorer не может загрузить download.php с http://www.example.com», добавьте эти заголовки в свой скрипт:

header("Pragma: ");

header("Cache-Control: ");

Код удалит Cache-Control из заголовков, что создает проблему с загрузкой.

Вышеприведенный код должен быть добавлен в верхнюю часть файла.

Это отлично работает для нас.

Удалось выполнить эту работу, используя первый пример из php.net

http://us3.php.net/manual/en/function.readfile.php

header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); 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)); ob_clean(); flush(); readfile($file); exit;
header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); 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)); ob_clean(); flush(); readfile($file); exit; 

Замените это:
header("Content-type: application/octet-stream");
с этим:
header("Content-Type: application/force-download");

Согласно этому сообщению , IE обычно не прослушивает ваши заголовки и вместо этого ищет для себя то, что вы отправляете.

Просто подсказка, если кто-то (как и я) сталкивается с проблемами, непосредственно входя в filedownload в адресную строку, используя защищенный https-запрос. Существует ошибка IE, которая приводит к сбою этой загрузки:

http://support.microsoft.com/kb/323308/en-us

Кажется, что обходным путем является настройка заголовков кешей в соответствии с этой статьей.

Никогда не заменяйте этот заголовок: «Content-type: application / octet-stream»);

с этим: header («Content-Type: application / force-download»);

«application / octet-stream» просто самый универсальный и работает в большинстве браузеров.

Я попытался использовать «application / zip» в одном из моих тестов, так как я имел техническую обработку ZIP-файла, но IE6.0 испортил загрузку! Однако все остальное было нормально. Но да, пришлось переключиться обратно на «application / octet-stream», поэтому любой код, который пытается обнаружить расширение файла, и переключиться на другие типы контента, специфичные для расширения, являются рискованными! Вам лучше использовать «application / octet-stream» для ВСЕХ двоичных файлов!