1

i am using the following PHP upload script to upload an image and store it into a directory.

I now want the script to identify the type of the uploaded image, and if it is not image/jpeg, then the script would automatically convert the image to JPEG format before storing it.

Could someone show me how I could achieve this?

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = 'Profile_Pic';
include '../include/config.php';

/**
 * uploadFile()
 * 
 * @param string $file_field name of file upload field in html form
 * @param bool $check_image check if uploaded file is a valid image
 * @param bool $random_name generate random filename for uploaded file
 * @return array
 */
function uploadFile ($file_field = null, $check_image = false, $random_name = false) {

  //Config Section    
  //Set file upload path
  $path = '../data/user/image/'.$_SESSION['id'].'/'; //with trailing slash
  //Set max file size in bytes
  $max_size = 1000000;
  //Set default file extension whitelist
  $whitelist_ext = array('jpg','png','gif');
  //Set default file type whitelist
  $whitelist_type = array('image/jpeg', 'image/png','image/gif');

  //The Validation
  // Create an array to hold any output
  $out = array('error'=>null);

  if (!$file_field) {
    $out['error'][] = "Please specify a valid form field name";           
  }

  if (!$path) {
    $out['error'][] = "Please specify a valid upload path";               
  }

  if (count($out['error'])>0) {
    return $out;
  }

  //Make sure that there is a file
  if((!empty($_FILES[$file_field])) && ($_FILES[$file_field]['error'] == 0)) {

    // Get filename
    $file_info = pathinfo($_FILES[$file_field]['name']);
    $name = $file_info['filename'];
    $ext = $file_info['extension'];

    //Check file has the right extension           
    if (!in_array($ext, $whitelist_ext)) {
      $out['error'][] = "Invalid file Extension";
    }

    //Check that the file is of the right type
    if (!in_array($_FILES[$file_field]["type"], $whitelist_type)) {
      $out['error'][] = "Invalid file Type";
    }

    //Check that the file is not too big
    if ($_FILES[$file_field]["size"] > $max_size) {
      $out['error'][] = "File is too big";
    }

    //If $check image is set as true
    if ($check_image) {
      if (!getimagesize($_FILES[$file_field]['tmp_name'])) {
        $out['error'][] = "Uploaded file is not a valid image";
      }
    }

    //Create full filename including path
    if ($random_name) {
      // Generate random filename
      $tmp = 'default';

      if (!$tmp || $tmp == '') {
        $out['error'][] = "File must have a name";
      }     
      $newname = $tmp.'.'.$ext;                                
    } else {
        $newname = $name.'.'.$ext;
    }

    //Check if file already exists on server
    if (file_exists($path.$newname)) {
      $out['error'][] = "A file with this name already exists";
    }

    if (count($out['error'])>0) {
      //The file has not correctly validated
      return $out;
    } 

    if (move_uploaded_file($_FILES[$file_field]['tmp_name'], $path.$newname)) {
      //Success
      $out['filepath'] = $path;
      $out['filename'] = $newname;
      return $out;
    } else {
      $out['error'][] = "Server Error!";
    }

  } else {
    $out['error'][] = "No file uploaded";
    return $out;
  }      
} }
?>
LSerni
  • 55,617
  • 10
  • 65
  • 107
Mark harris
  • 525
  • 15
  • 39
  • 1
    I believe the answer to this question is what you are looking for http://stackoverflow.com/questions/14549446/how-can-i-convert-all-images-to-jpg – bruceyyy Jun 17 '15 at 13:12
  • I have reworded the question to make it more clear. But you really should try something [ such as the answer @bruceyyy suggested ] and let us know how it worked, what you expected, what problems you encountered. – LSerni Jun 17 '15 at 15:15

1 Answers1

0

Put this before move_uploaded_file.

//non JPG, convert to JPG
if($_FILES[$file_field]['type'] != 'image/jpeg') {

   // create image resource
   $img = imagecreatefromjpeg($_FILES[$file_field]['tmp_name']);

   // store to directory
   imagejpeg($img, $path.$newname, $quality); // quality is between 0 (worst) to 100 (best), but this is not mandatory, you can skip quality parameter

   // free memory associated with image resource
   imagedestroy($img);

   // success, return filepath and name
   $out['filepath'] = $path;
   $out['filename'] = $newname;

   return $out;
}
riza
  • 671
  • 5
  • 9