2009-07-17 3 views
5

Мне нужно проверить, является ли данное изображение JPEG.Проверьте, является ли изображение 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!

Как это исправить?

ответ

3

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

$im = imagecreatefrompng(input_filename) 
imagejpeg($im, output_filename); 
17

Попробуйте функцию exif_imagetype изображения.

Пример:

if(exif_imagetype($filepath) != IMAGETYPE_JPEG){ 
    echo 'Not a JPEG image'; 
} 
0

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

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

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

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

Чтобы закончить, вы ознакомились с руководством (Handling file uploads)?

0

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

// 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

Нет назначения для '$ _FILES ['fname'] ['type']' всегда будет пропустить блок if. (т. е. успех) –

1

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

if($_FILES["fname"]["type"] == "image/jpeg") 
    { 
     echo "File type is JPEG"; 
    } 
+0

хакер может легко подделать тип мим. – hanshenrik

1

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

Также отметим, что:

(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); 
Смежные вопросы