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

У меня есть script, который берет ключ из $_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);

Ответ 1

Чтобы решить эту ошибку: "Internet Explorer не может загрузить download.php с www.example.com", Добавьте эти заголовки в свой script:

header("Pragma: ");

header("Cache-Control: ");

Код удалит Cache-Control из заголовков, что затрудняет загрузку.

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

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

Ответ 2

Удалось это сделать, используя первый пример из 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;

Ответ 3

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

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

Ответ 4

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

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

Только обходной путь, похоже, устанавливает заголовки кешей в соответствии с этой статьей.

Ответ 5

Никогда не заменяйте это: header ( "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" для ВСЕХ двоичных файлов!