Search code examples
phpfile-uploadfile-exists

file upload doesn't check for existing image


I got the below code from tidy-designs and it works fine except it doesn't check for existing image. when I upload the same image again it accepts with out any error. I figured out that the script is renaming the file once uploaded to new random name and it is also trying to see if the new name exists in the folder where the image is saved. That means it is giving each uploaded image new random name and tries to check if the new name exists. how can I check for existing image? Do i need to remove the function which renames the uploaded image?

     <?php

function uploadFile ($file_field = null, $check_image = false, $random_name = false) {

//Config Section    
//Set file upload path
$path = 'productpic/'; //with trailing slash
//Set max file size in bytes
$max_size = 2097152;
//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'][] = "We are sorry, the image must be less than 2MB";
}

//If $check image is set as true
if ($check_image) {
  if (!getimagesize($_FILES[$file_field]['tmp_name'])) {
    $out['error'][] = "The file you trying to upload is not an Image, we only accept images";
  }
}

//Create full filename including path
if ($random_name) {
  // Generate random filename
  $tmp = str_replace(array('.',' '), array('',''), microtime());

  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'][] = "the image you trying to upload already exists, please upload only once";
}

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 image uploaded";
return $out;
}      
}
?>

<?php
if (isset($_POST['submit'])) {
$file = uploadFile('file', true, true);
if (is_array($file['error'])) {
$message = '';
foreach ($file['error'] as $msg) {
  $message .= '<p>'.$msg.'</p>';    
}
} else {
$message = "File uploaded successfully";
}
echo $message;
}
?>
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
<input name="file" type="file" size="20" />
<input name="submit" type="submit" value="Upload" />
</form>

Solution

  • You don't need to remove any code - just change how you are calling the function.

    The function is defined as:

    function uploadFile ($file_field = null, $check_image = false, $random_name = false)

    You can see the $random_name variable is passed as a parameter to the function. If set to true it is setting a random filename for the uploaded image.

    You're calling the function like so:

    $file = uploadFile('file', true, true);
    

    So you can see the third parameter you're passing (i.e. corresponding to the $random_name parameter is true.

    Try changing that to

    $file = uploadFile('file', true, false);
    

    To stop the function from forcing the file to have a random filename.