Проверьте, является ли изображение JPEG - PullRequest
6 голосов
/ 17 июля 2009

Мне нужно проверить, является ли данное изображение JPEG.

if ($_FILES["fname"]["error"] > 0) {
    $imgData = "hyperlink/holder.jpg";
} else {
    $imgData ="hyperlink/" . $_FILES["fname"]["name"];
}
// Only accept jpg images
// pjpeg is for Internet Explorer should be jpeg
if (!($_FILES["fname"]["type"] == "image/pjpeg") ) {
    print "I only accept jpg files!";
    exit(0);
}

При переходе к первому оператору в первом операторе if, который он всегда дает, я принимаю только файлы jpg!

Как я могу это исправить?

Ответы [ 6 ]

22 голосов
/ 17 июля 2009

Попробуйте функцию exif_imagetype image.

Пример:

if(exif_imagetype($filepath) != IMAGETYPE_JPEG){
    echo 'Not a JPEG image';
}
3 голосов
/ 17 июля 2009

PHP имеет такую ​​хорошую поддержку типов изображений, я удивляюсь, почему вы ограничиваете свое приложение. Всего за пару строк кода вы можете работать с любым форматом ввода и конвертировать его в формат JPEG, если это необходимо ...

$im = imagecreatefrompng(input_filename)
imagejpeg($im, output_filename);
2 голосов
/ 22 января 2015

Я считаю следующие работы:

Также обратите внимание, что:

(exif_imagetype ($ ImagePathAndName) == IMAGETYPE_JPEG)

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

Ниже приведено логическое утверждение «и», т. Е. Оба эти теста должны быть пройдены, чтобы изображение квалифицировалось как действительное и не поврежденное и т. Д .:

if ((exif_imagetype($ImagePathAndName) == IMAGETYPE_JPEG) && (imagecreatefromjpeg( $ImagePathAndName ) !== false ))
{
echo 'The picture is a valid jpg<br>';
}

Примечание. Эту строку кода необходимо разместить в верхней части кода php, чтобы избежать появления предупреждающих сообщений от imagecreatefromjpeg ($ ImagePathAndName) при обнаружении поддельного / поврежденного файла изображения.

ini_set(‘gd.jpeg_ignore_warning’, 1);
1 голос
/ 03 декабря 2014

Проверьте тип файла mime (Multipurpose Internet Mail Extensions) с этим кодом. И проверьте желаемый тип. Вы также можете обнаружить png, gif с этим кодом.

 if($_FILES["fname"]["type"] == "image/jpeg")
  {
      echo "File type is JPEG";
  }
0 голосов
/ 17 июля 2009

Почему бы вам не попробовать создать массив исключений (файлы, которые вы хотите, чтобы пользователь мог загружать).

// Hyperlink for your website
$hyperlink = "http://www.yourwebsitehere.com";

if($_FILES['fname']['error'] > 0)
{
    $image= $hyperlink . "/holder.jpg";
} 
else
{
    $image = $hyperlink . "/" . $_FILES['fname']['name'];
}

// Only accept files of jpeg format
$exceptions = array("image/jpg", "image/jpeg", "image/pjpeg");

foreach($exceptions as $value)
{
    if($_FILES['fname']['type'] != $value)
    {
        echo "I only accept jpeg images!";
        break; // Or exit();
    }
}
0 голосов
/ 17 июля 2009

При использовании $_FILES вы полагаетесь на информацию, отправленную клиентом, что не является лучшим решением (вы видели, что оно не всегда одинаково, и, если я правильно помню, $_FILES['...']['type'] подделать).

Если вы используете PHP> = 5.3 (или можете устанавливать пакеты PECL), возможно, вы можете взглянуть на расширение Fileinfo . Если вы используете более старую версию, как насчет mime_content_type?

И, как сказал Скотт, зачем разрешать только jpeg?

Глядя на код лучше: когда вы находитесь в первом случае (error > 0), вы назначаете файл по умолчанию для $imgData? Почему пробелы вокруг "гиперссылки"? И почему вы всегда используете для проверки content-type, даже если раньше было несколько ошибок?

В заключение, вы посмотрели руководство ( Обработка загрузки файлов )?

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