mama
mama

Reputation:

Check if the image is a JPEG

I need to check whether a given image is a 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);
}

When it goes to first statement in the first if statement it always gives I only accept jpg files!

How can I fix it?

Upvotes: 10

Views: 36582

Answers (6)

CMP
CMP

Reputation: 1210

I believe the following works:

Also note that:

(exif_imagetype($ImagePathAndName) == IMAGETYPE_JPEG)

only reads the first few bytes looking for an image header so isn't really good enough to confirm if an image is corrupt.

Below I have it in a logical “and” statement i.e. both of these tests must be passed in order for the image to qualify as being valid and non-corrupt etc:

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

Note: You need to place this line of code at the top of the php code in order to avoid seeing the warning messages from imagecreatefromjpeg( $ImagePathAndName ) when it encounters a fake/corrupt image file.

ini_set(‘gd.jpeg_ignore_warning’, 1);

Upvotes: 6

Muhammad Ashikuzzaman
Muhammad Ashikuzzaman

Reputation: 3143

Check the mime (Multipurpose Internet Mail Extensions) type of file with this code. And verify your desired type. You can also detect png,gif with this code.

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

Upvotes: 0

Pascal MARTIN
Pascal MARTIN

Reputation: 400972

When using $_FILES, you are relying on informations sent by the client, which is not the best thing to do (you've seen it's not always the same, and, if I remember correctly, $_FILES['...']['type'] can be faked).

If you are using PHP >= 5.3 (or can install PECL packages), maybe you can give a look to the extension Fileinfo. If you are using an older version, what about mime_content_type?

And, as said by Scott, why allow only jpeg?

Looking about the code better : when you are in the first case (error > 0), you are assigning a default file to $imgData? Why the spaces around "hyperlink"? And why do you always use to check the content-type, even if there was an error a couple of lines before?

To finish, did you have a look at the manual (Handling file uploads)?

Upvotes: 1

Scott Evernden
Scott Evernden

Reputation: 39926

PHP has such good image-type support, i wonder why you are restricting your app. In just a couple lines of code you can deal with any input format and convert to jpeg, if that is a requirement...

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

Upvotes: 6

user140125
user140125

Reputation: 143

Why don't you try creating an array of exceptions (the files you want the user to be able to upload).

// 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();
    }
}

Upvotes: 1

MitMaro
MitMaro

Reputation: 5917

Try the exif_imagetype image function.

Example:

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

Upvotes: 31

Related Questions