Mr.Canuck Posted March 22, 2010 Share Posted March 22, 2010 Hey everyone. I have this image upload script and currently if I upload an image with the same name as a previous image already in the destination folder, it automatically creates a new image name so that no images can get overwritten. I want the opposite. I want an image with the same name to be overwritten. Does anyone know how to change the following code to allow images of the same name to be over-written? Thanks. Here is the relevant part of the code: // make a unique filename for the uploaded file and check it is // not taken... if it is keep trying until we find a vacant one foreach($active_keys as $key) { $now = time(); while(file_exists($uploadFilename[$key] = $uploadsDirectory.$now.'-'.$_FILES[$fieldname]['name'][$key])) { $now++; } } // now let's move the file to its final and allocate it with the new filename foreach($active_keys as $key) { @move_uploaded_file($_FILES[$fieldname]['tmp_name'][$key], $uploadFilename[$key]) or error('receiving directory insuffiecient permission', $uploadForm); } Here is the HTML as well: <form id="Upload" action="<?php echo $uploadHandler ?>" enctype="multipart/form-data" method="post"> <h1> Upload form </h1> <p> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>"> </p> <p> <label for="file1">Slideshow Image #1:</label> <input id="file1" type="file" name="file[]"> </p> <p> <label for="file2">Slideshow Image #2:</label> <input id="file2" type="file" name="file[]"> </p> <p> <label for="file3">Slideshow Image #3:</label> <input id="file3" type="file" name="file[]"> </p> <p> <label for="file4">Slideshow Image #4:</label> <input id="file4" type="file" name="file[]"> </p> <p> <label for="file5">Slideshow Image #5:</label> <input id="file5" type="file" name="file[]"> </p> <p> <label for="submit"></label> <input id="submit" type="submit" name="submit" value="Upload Images!"> </p> </form> Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/ Share on other sites More sharing options...
inversesoft123 Posted March 22, 2010 Share Posted March 22, 2010 Best solution is to create new id for image and add it to hashed file name. Something like this $getfilename="SELECT * from table where fname='$filename'"; $getfilename2=mysql_query($getfilename); $getfilename3=mysql_fetch_array($getfilename2); if($getfilename3) { $updatedup = "UPDATE table set duprotect=duprotect+1 WHERE fname='$filename'"; mysql_query($updatedup) or die("Could not update duplicate records"); } Like I always use hashed $filename[number].mp3 whis is duprotect here. also in mysql database we can see how much duplicate files are there like if hola.mp3 is duplicated 8 times. 8 is a duprotect inside the database, Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/#findComment-1030081 Share on other sites More sharing options...
Mr.Canuck Posted March 22, 2010 Author Share Posted March 22, 2010 I forgot to mention. The files are not going to be stored in a database. They will just be stored in a "photos" directory on the server. Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/#findComment-1030089 Share on other sites More sharing options...
inversesoft123 Posted March 22, 2010 Share Posted March 22, 2010 <?PHP function checkduplicates($dir) { if(substr($dir, -1, 1) != "/") { //if the last character isnt a / then add it $dir = $dir."/"; } if(is_readable($dir)) { //only continue if its readable $files = scandir($dir); foreach($files as $file) { //loop through it if(!is_dir($dir.$file) && file_exists($dir.$file)) { //if its not a directory and the file exists $hash = md5_file($dir.$file); //creates the hash if(strlen($a[$hash]) != 0) { //already being used so put in duplicate array $b[$hash] = $file; } else { //new key first array $a[$hash] = $file; } } else { //directory directory array $c[] = "<a href='?q={$dir}{$file}/'>$file</a>"; } } } return '<table> <tr> <td valign="top" class="title">Folders</td> </tr> <tr> <td valign="top" class="cc"><pre>'.print_r($c, true).'</pre></td> </tr> <tr> <td valign="top" class="title">Duplicates</td> </tr> <tr> <td valign="top" class="cc"><pre>'.print_r($b, true).'</pre></td> </tr> <tr> <td valign="top" class="title">Originals</td> </tr> <tr> <td valign="top" class="cc"><pre>'.print_r($a, true).'</pre></td> </tr> </table>'; } //not much security so dont make this public lol $file = $_GET['q']; if(!is_dir($file)) { //default location $file = "/"; } ?> <html> <head> <title>File Duplicate Detector</title> <style> body { background: #e7e7e7; } td.title { background: #949494; border-top: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; } td.cc { background: #bebebe; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black; } </style> </head> <body> <form method="get"> <input style="width:350px;" type="text" name="q" value="<?=$file?>"> <input type="submit" value="Search!"> </form> Duplicate files in <?=$file?>:<br /><br /> <?PHP //calls the function echo checkduplicates($file); ?> </body> </html> Then you can use my non database part from my previous post. Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/#findComment-1030111 Share on other sites More sharing options...
Mr.Canuck Posted March 22, 2010 Author Share Posted March 22, 2010 Thanks for the reply. I'm a PHP noob so bare with me. So if I WANT images with the same name to overwrite themselves, why do we need to check for duplicates at all? Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/#findComment-1030145 Share on other sites More sharing options...
inversesoft123 Posted March 25, 2010 Share Posted March 25, 2010 Because if you want to prevent file overwriting you need to check duplicate files in the directory and if duplicate exists then rename file after uploading and save it to same directory. Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/#findComment-1031512 Share on other sites More sharing options...
Mr.Canuck Posted March 25, 2010 Author Share Posted March 25, 2010 I think you have my request mixed up. I DO NOT want to prevent file overwriting. I WANT the files to overwrite. So if I am uploading a file called test.jpg and there is already another file called test.jpg in the "uploaded_files" directory, I WANT that file to be over-written. (sorry for using CAPS, but I'm just trying to make sure you understand what I am after). Here is the full code below: <?php // filename: upload.processor.php // first let's set some variables // make a note of the current working directory, relative to root. $directory_self = str_replace(basename($_SERVER['PHP_SELF']), '', $_SERVER['PHP_SELF']); // make a note of the directory that will recieve the uploaded files $uploadsDirectory = $_SERVER['DOCUMENT_ROOT'] . $directory_self . 'uploaded_files/'; // make a note of the location of the upload form in case we need it $uploadForm = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self . 'multiple.upload.form.php'; // make a note of the location of the success page $uploadSuccess = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self . 'multiple.upload.success.php'; // name of the fieldname used for the file in the HTML form $fieldname = 'file'; //echo'<pre>';print_r($_FILES);exit; // Now let's deal with the uploaded files // possible PHP upload errors $errors = array(1 => 'php.ini max file size exceeded', 2 => 'html form max file size exceeded', 3 => 'file upload was only partial', 4 => 'no file was attached'); // check the upload form was actually submitted else print form isset($_POST['submit']) or error('the upload form is neaded', $uploadForm); // check if any files were uploaded and if // so store the active $_FILES array keys $active_keys = array(); foreach($_FILES[$fieldname]['name'] as $key => $filename) { if(!empty($filename)) { $active_keys[] = $key; } } // check at least one file was uploaded count($active_keys) or error('No files were uploaded', $uploadForm); // check for standard uploading errors foreach($active_keys as $key) { ($_FILES[$fieldname]['error'][$key] == 0) or error($_FILES[$fieldname]['tmp_name'][$key].': '.$errors[$_FILES[$fieldname]['error'][$key]], $uploadForm); } // check that the file we are working on really was an HTTP upload foreach($active_keys as $key) { @is_uploaded_file($_FILES[$fieldname]['tmp_name'][$key]) or error($_FILES[$fieldname]['tmp_name'][$key].' not an HTTP upload', $uploadForm); } // validation... since this is an image upload script we // should run a check to make sure the upload is an image foreach($active_keys as $key) { @getimagesize($_FILES[$fieldname]['tmp_name'][$key]) or error($_FILES[$fieldname]['tmp_name'][$key].' not an image', $uploadForm); } // make a unique filename for the uploaded file and check it is // not taken... if it is keep trying until we find a vacant one foreach($active_keys as $key) { $now = time(); while(file_exists($uploadFilename[$key] = $uploadsDirectory.$now.'-'.$_FILES[$fieldname]['name'][$key])) { $now++; } } // now let's move the file to its final and allocate it with the new filename foreach($active_keys as $key) { @move_uploaded_file($_FILES[$fieldname]['tmp_name'][$key], $uploadFilename[$key]) or error('receiving directory insuffiecient permission', $uploadForm); } // If you got this far, everything has worked and the file has been successfully saved. // We are now going to redirect the client to the success page. header('Location: ' . $uploadSuccess); // make an error handler which will be used if the upload fails function error($error, $location, $seconds = 5) { header("Refresh: $seconds; URL=\"$location\""); echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'."\n". '"http://www.w3.org/TR/html4/strict.dtd">'."\n\n". '<html lang="en">'."\n". ' <head>'."\n". ' <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">'."\n\n". ' <link rel="stylesheet" type="text/css" href="stylesheet.css">'."\n\n". ' <title>Upload error</title>'."\n\n". ' </head>'."\n\n". ' <body>'."\n\n". ' <div id="Upload">'."\n\n". ' <h1>Upload failure</h1>'."\n\n". ' <p>An error has occured: '."\n\n". ' <span class="red">' . $error . '...</span>'."\n\n". ' The upload form is reloading</p>'."\n\n". ' </div>'."\n\n". '</html>'; exit; } // end error handler ?> <?php // filename: upload.form.php // first let's set some variables // make a note of the current working directory relative to root. $directory_self = str_replace(basename($_SERVER['PHP_SELF']), '', $_SERVER['PHP_SELF']); // make a note of the location of the upload handler $uploadHandler = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self . 'multiple.upload.processor.php'; // set a max file size for the html upload form $max_file_size = 3000000; // size in bytes // now echo the html page ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="stylesheet.css"> <title>Slideshow Image Upload Form</title> </head> <body> <form id="Upload" action="<?php echo $uploadHandler ?>" enctype="multipart/form-data" method="post"> <h1> Shoehive Slideshow Image Upload Form </h1> <p> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>"> </p> <p> <label for="file1">Slideshow Image #1:</label> <input id="file1" type="file" name="file[]"> </p> <p> <label for="file2">Slideshow Image #2:</label> <input id="file2" type="file" name="file[]"> </p> <p> <label for="file3">Slideshow Image #3:</label> <input id="file3" type="file" name="file[]"> </p> <p> <label for="file4">Slideshow Image #4:</label> <input id="file4" type="file" name="file[]"> </p> <p> <label for="file5">Slideshow Image #5:</label> <input id="file5" type="file" name="file[]"> </p> <p> <label for="submit"></label> <input id="submit" type="submit" name="submit" value="Upload Images!"> </p> </form> </body> </html> Link to comment https://forums.phpfreaks.com/topic/196152-make-image-overwrite-previous-image-in-upload-form/#findComment-1031589 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.