2009-08-02 2 views
11

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


$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); 
+4

Взгляните на SQL-инъекцию и mysql_real_escape_string. Этот фрагмент кода уязвим. – erenon

+0

О, господин да, пожалуйста, используйте mysql_real_escape_string – AaronLS

+0

Не знаю об этом, но это может иметь какое-то отношение к расширению файла в $ file – AaronLS

ответ

28

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

header("Pragma: ");

header("Cache-Control: ");

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

Вышеупомянутый код следует добавить в начало файла.

Это прекрасно работает для нас.

+0

Спасибо Миллиону за спасение моей жизни от чужих ошибок, исходящих из планет Марса ... Я никогда не знал, что могу сделать но твоя эта твоя доспеха помогла мне убить ОЧЕНЬ ОЧЕНЬ БОЛЬШОЙ БУГ ... Ошибка мертва ... Я! .. Спасибо :-) – effkay

+0

Мы столкнулись с этой проблемой. попробовал так много рекомендаций из сообщений в блогах и т. д. Это было исправлено! – BishopZ

3

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

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

+0

Я уже пробовал это раньше, такую ​​же ошибку, к сожалению, спасибо. – Stuart

+1

'application/octet-stream' - официальный тип MIME-носителя для данных, предназначенных для загрузки (см. RFC 2046). – Gumbo

+0

Мне интересно, как люди знают все эти RFC? – 2009-08-02 14:17:54

0

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

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

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

0

Никогда не заменяйте это: заголовок («Тип содержимого: приложение/октет-поток»);

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

«приложение/октет-поток» является самым универсальным и работает в большинстве браузеров.

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

Смежные вопросы