PHP - как убедиться, что загруженный файл является JPG, GIF или PNG? - PullRequest
4 голосов
/ 24 ноября 2011

В php я могу проверить, имеет ли загруженный файл правильный тип по расширению, поэтому код должен выглядеть следующим образом:

if ((($_FILES["photo1"]["type"] == "image/gif")
|| ($_FILES["photo1"]["type"] == "image/jpeg")
|| ($_FILES["photo1"]["type"] == "image/png"))
&& ($_FILES["photo1"]["size"] < 500000)) //also limiting size

Затем на следующем шаге в моем коде я готовлю файл для дальнейшей обработки. Но что, если кто-то перед загрузкой изменит text_file.doc или javascript_file.js на samplefile.jpg?

move_uploaded_file(($_FILES['photo1']['tmp_name']), "photos/1.jpg");
$source1 = imagecreatefromjpeg("../photos/source1.jpg");

Тогда пользователь увидит ошибки с шага imagecreatefromjpeg:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG
library reports unrecoverable error: in...

Как пропустить часть обработки, если файл не является графическим файлом и не отображает ошибки?

Ответы [ 3 ]

5 голосов
/ 24 ноября 2011

Как написано в документации для file-uploads , указано, что $_FILES['userfile']['type'] равно

MIME-тип файла, если браузер предоставил эту информацию.Примером может быть «image / gif».Этот тип MIME, однако, не проверяется на стороне PHP и поэтому не принимает его значение как должное.

Это означает, что он не проверяется на стороне PHP, что вы должны делать с mime_content_type и подтвердите его тип mime.

В качестве альтернативы, вы можете использовать getimagesize , чтобы фактически проверить, имеет ли загруженный файл размер изображения, и если нет, то это неизображение.

3 голосов
/ 24 ноября 2011

Я бы использовал getimagesize и проверил бы на возможные ошибки, что-то вроде этого:

try {
    $size = getimagesize("your_image_file");
    echo 'image!';
} catch (Exception $e) {
    echo 'no known image format!'; 
}

Эта функция GD не идеальна, но она может работать с несколькими форматами графических файлов.

Есть несколько способов пропустить предупреждения в PHP. Если такая ошибка может произойти, это обычно случается. Либо ожидайте этого в своем коде (обычно предпочтительнее, см. Мой пример с try ... catch), либо настройте свою среду под свои нужды (например, пропустите предупреждения).

1 голос
/ 24 ноября 2011

Сначала вам нужно отредактировать php.ini, чтобы отключить вывод предупреждений и сообщений об ошибках пользователю, чтобы эти пользователи не видели ошибку.По крайней мере, для производственных систем это рекомендуется.

Тогда вы сможете проверить возвращаемое значение функции.Согласно http://de.php.net/manual/en/function.imagecreatefromjpeg.php, предполагается, что он возвращает false, если не может открыть предоставленный вами файл.

Кроме того, с обработкой исключений (см. http://www.php.net/manual/en/language.exceptions.php) вы можете отлавливать и обрабатывать ошибкисообщения и предупреждения, подобные тому, который вы опубликовали выше.

...