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" для ВСЕХ двоичных файлов!