ssupernnew
ssupernnew

Reputation: 37

PHP upload form with multiple file extensions & uppercase

I got my php upload form working (allowing .jpg), but am not sure how to add .JPG (uppercase issue) or .jpeg.

Could someone please show me how to add these extensions to the following code?

<?php
//–°heck that we have a file
if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error'] == 0)) {
  //Check if the file is JPEG image and it's size is less than 350Kb
  $filename = basename($_FILES['uploaded_file']['name']);
  $ext = substr($filename, strrpos($filename, '.') + 1);
  if (($ext == "jpg") && ($_FILES["uploaded_file"]["type"] == "image/jpeg") && 
    ($_FILES["uploaded_file"]["size"] < 16000000)) {
    //Determine the path to which we want to save this file
      $newname = dirname(__FILE__).'/upload/'.$filename;
      //Check if the file with the same name is already exists on the server
      if (!file_exists($newname)) {
        //Attempt to move the uploaded file to it's new place
        if ((move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$newname))) {
           echo "It's done! The file has been saved!";
        } else {
           echo "Error: A problem occurred during file upload!";
        }
      } else {
         echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";
      }
  } else {
     echo "Error: Only .jpg images under 15 Mb are accepted for upload";
  }
} else {
 echo "Error: No file uploaded";
}
?>

Thanks so much for your help and time!

Upvotes: 2

Views: 4481

Answers (4)

webbiedave
webbiedave

Reputation: 48887

Convert the extension to lowercase when comparing.

$ext = strtolower($ext);

if ( ($ext == 'jpg' || $ext == 'jpeg') && ($_FILES["uploaded_file"]["type"] == "image/jpeg") && 
    ($_FILES["uploaded_file"]["size"] < 16000000)) {

Upvotes: 1

Brad Christie
Brad Christie

Reputation: 101614

In addition to @Swanny, you have a couple of more options:

The in_array approach (coupled with strtolower):

if (in_array(strtolower($est),Array('jpg','jpeg')))

There's using strcasecmp to eliminate case:

if (strcasecmp($ext,'jpg') === 0 || strcasecmp($ext,'jpeg') === 0)

Or, the good'ol'fashioned RegEx apprach (which eliminated making the $ext variable:

if (preg_match('/\.(jpe?g)$/i',$filename))

which can also be modified like so (adding additional extensions separated by pipe (|) characters)

if (preg_match('/\.(jpe?g|gif|png)$/i',$filename))

Upvotes: 2

Sandbox
Sandbox

Reputation: 181

Try this. Converts the extension of the current file to lower case using strtolower() then checks against an array of accepted extensions using in_array():

<?php
$acceptedExts = array ('jpg','jpeg');

//–check that we have a file

if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error'] == 0)) {
  //Check if the file is JPEG image and it's size is less than 350Kb
  $filename = basename($_FILES['uploaded_file']['name']);
  $ext = strtolower (substr($filename, strrpos($filename, '.') + 1));
  if (in_array($ext,$acceptedExts) && ($_FILES["uploaded_file"]["type"] == "image/jpeg") && 
    ($_FILES["uploaded_file"]["size"] < 16000000)) {
    //Determine the path to which we want to save this file
      $newname = dirname(__FILE__).'/upload/'.$filename;
      //Check if the file with the same name is already exists on the server
      if (!file_exists($newname)) {
        //Attempt to move the uploaded file to it's new place
        if ((move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$newname))) {
           echo "It's done! The file has been saved!";
        } else {
           echo "Error: A problem occurred during file upload!";
        }
      } else {
         echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";
      }
  } else {
     echo "Error: Only .jpg images under 15 Mb are accepted for upload";
  }
} else {
 echo "Error: No file uploaded";
}
?>

Note that it won't work for other image types as you are still checking the file type is image/jpeg:

$_FILES["uploaded_file"]["type"] == "image/jpeg"

Upvotes: 0

Stuart
Stuart

Reputation: 1178

You would probably change line 6 from:

if (($ext == "jpg") && ($_FILES["uploaded_file"]["type"] == "image/jpeg") &&

to:

if (($ext == "jpg" || $ext == "jpeg" || $ext == "JPG") && ($_FILES["uploaded_file"]["type"] == "image/jpeg") &&

Although if you want to expand this further I'd recommend using an array of filetypes and checking the array, much easier to manage. Specifically using the in_array function http://php.net/manual/en/function.in-array.php

Upvotes: 1

Related Questions