PHP скрипт для загрузки файла не работает в IE - PullRequest
11 голосов
/ 02 августа 2009

У меня есть скрипт, который берет ключ из $ _GET ['key'], ищет местоположение в базе данных и использует файл чтения вместе с некоторыми заголовками для представления загрузки для использования. Это работает в 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);

Ответы [ 5 ]

28 голосов
/ 16 декабря 2010

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

header("Pragma: ");

header("Cache-Control: ");

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

Приведенный выше код должен быть добавлен вверху файла.

У нас работает нормально.

9 голосов
/ 03 августа 2009

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

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

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

0 голосов
/ 29 октября 2015

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

с этим: заголовок («Content-Type: application / force-download»);

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

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

0 голосов
/ 04 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...