даже PHP имеет «ошибки» с IE - PullRequest
3 голосов
/ 19 марта 2010

Это не настоящая ошибка, НО наверняка это не то, что вы ожидаете. У меня есть этот пример кода для загрузки изображений:

if($type=="image/jpg" || $type=="image/jpeg" || $type=="image/pjpeg" || $type=="image/tiff" || $type=="image/gif" || $type=="image/png") {
   // make upload
else echo "Incorrect format ...."; 

Проблема в том, что если я изменю расширение изображения, скажем, на .jpgq или даже .jpg%, и я попытаюсь загрузить его, FF и Chrome скажут, что тип файла - application / octet- поток "и обычно условие будет ложным.

IE, с другой стороны, скажет, что тип файла "image / jpeg", условие будет истинным и файл будет загружен. Конечно, любой браузер, пытающийся прочитать изображение позже, не сможет этого сделать.

Это не ошибка, потому что на msdn.microsoft.com говорится, что: «Если« предложенный »(предоставленный сервером) тип MIME неизвестен (не известен и не является неоднозначным), FindMimeFromData немедленно возвращает этот тип MIME» и «Если предоставленный сервером тип MIME является известным или неоднозначным, буфер сканируется в попытке проверить или получить тип MIME из фактического содержимого».

Мои вопросы:

  1. Почему IE / сервер знает настоящий тип MIME при загрузке, НО он не сможет прочитать его с сервера?
  2. Как обойти эту проблему (если файл не имеет правильного расширения, условие должно быть ложным)? Разумно ли проверять формат расширения (а не тип MIME)?
  3. не рекомендуется ли использовать какое-либо из вышеуказанных расширений? Должен ли я добавить другие?

Ответы [ 2 ]

4 голосов
/ 19 марта 2010

Забудьте проверить тип пантомимы. Вместо этого используйте getimagesize () .

0 голосов
/ 19 марта 2010

По соображениям производительности ваш веб-сервер обычно не проверяет файл на наличие mimetype, он обычно использует только расширение.

Поэтому при загрузке вам нужно прочитать mimetype, а затем сохранить файл с расширением, соответствующим mimetype, если вы хотите, чтобы веб-сервер непосредственно обслуживал файл. Альтернативой является использование оболочки загрузки, которая считывает mimetype из файла и передает его клиенту.

Базовый пример,

/* verify and sanitize any file extension from mimetype
 */
    switch($subtype) {
    case 'pjpeg':
    case 'jpeg':
        if (!preg_match('/\.jp(e)?g$/i', $real_name)) {
            $real_name .= '.jpg';
        }
        break;

    default:
        if (!preg_match('/\.'.$subtype.'$/i', $real_name)) {
            $real_name .= ".$subtype";
        }
        break;
    }
...