Administrators Nathan Posted December 12, 2013 Administrators Posted December 12, 2013 I was looking for a decent file upload script the other day that does some error checking. Found this one pretty useful, so figured I would share. <?php // RAY_upload_example.php error_reporting(E_ALL); // MANUAL REFERENCE PAGES YOU MUST UNDERSTAND TO UPLOAD FILES // http://php.net/manual/en/reserved.variables.files.php // http://php.net/manual/en/features.file-upload.php // http://php.net/manual/en/features.file-upload.common-pitfalls.php // http://php.net/manual/en/function.move-uploaded-file.php // http://php.net/manual/en/function.getimagesize.php // MANUAL PAGES THAT ARE IMPORTANT IF YOU ARE DEALING WITH LARGE FILES // http://php.net/manual/en/ini.core.php#ini.upload-max-filesize // http://php.net/manual/en/ini.core.php#ini.post-max-size // http://php.net/manual/en/info.configuration.php#ini.max-input-time // PHP 5.1+ SEE http://php.net/manual/en/function.date-default-timezone-set.php date_default_timezone_set('America/Chicago'); // ESTABLISH THE NAME OF THE DESTINATION FOLDER ('uploads' DIRECTORY) $uploads = 'RAY_junk'; if (!is_dir($uploads)) { mkdir($uploads); } // ESTABLISH THE BIGGEST FILE SIZE WE CAN ACCEPT - ABOUT 8 MB $max_file_size = '8000000'; // ESTABLISH THE MAXIMUM NUMBER OF FILES WE CAN UPLOAD $nf = 3; // ESTABLISH THE KINDS OF FILE EXTENSIONS WE CAN ACCEPT $file_exts = array ( 'jpg' , 'gif' , 'png' , 'txt' , 'pdf' ) ; // LIST OF THE ERRORS THAT MAY BE REPORTED IN $_FILES[]["error"] (THERE IS NO #5) $errors = array ( 0 => "Success!" , 1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini" , 2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" , 3 => "The uploaded file was only partially uploaded" , 4 => "No file was uploaded" , 5 => "UNDEFINED ERROR" , 6 => "Missing a temporary folder" , 7 => "Cannot write file to disk" ) ; // IF THERE IS NOTHING IN $_POST, PUT UP THE FORM FOR INPUT if (empty($_POST)) { ?> <h2>Upload <?php echo $nf; ?> file(s)</h2> <!-- SOME THINGS TO NOTE ABOUT THIS FORM... ENCTYPE IN THE HTML <FORM> STATEMENT MAX_FILE_SIZE MUST PRECEDE THE FILE INPUT FIELD INPUT NAME= IN TYPE=FILE DETERMINES THE NAME YOU FIND IN $_FILES ARRAY ABSENCE OF ACTION= ATTRIBUTE IN FORM TAG CAUSES POST TO SAME URL --> <form name="UploadForm" enctype="multipart/form-data" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size; ?>" /> <p> Find the file(s) you want to upload and click the "Upload" button below. </p> <?php // CREATE INPUT STATEMENTS FOR UP TO $n FILE NAMES for ($n = 0; $n < $nf; $n++) { echo "<input name=\"userfile$n\" type=\"file\" size=\"80\" /><br/>\n"; } ?> <br/>Check this box <input autocomplete="off" type="checkbox" name="overwrite" /> to <strong>overwrite</strong> existing files. <input type="submit" value="Upload" /> </form> <?php die(); } // END OF THE FORM SCRIPT // WE HAVE GOT SOMETHING IN $_POST - RUN THE ACTION SCRIPT else { // THERE IS POST DATA - PROCESS IT echo "<h2>Results: File Upload</h2>\n"; // ACTIVATE THIS TO SEE WHAT IS COMING THROUGH // echo "<pre>"; var_dump($_FILES); var_dump($_POST); echo "</pre>\n"; // ITERATE OVER THE CONTENTS OF $_FILES foreach ($_FILES as $my_uploaded_file) { // SKIP OVER EMPTY SPOTS - NOTHING UPLOADED $error_code = $my_uploaded_file["error"]; if ($error_code == 4) continue; // SYNTHESIZE THE NEW FILE NAME $f_type = trim(strtolower(end (explode( '.', basename($my_uploaded_file['name'] ))))); $f_name = trim(strtolower(current(explode( '.', basename($my_uploaded_file['name'] ))))); $my_new_file = getcwd() . DIRECTORY_SEPARATOR . $uploads . DIRECTORY_SEPARATOR . $f_name . '.' . $f_type ; $my_file = $uploads . DIRECTORY_SEPARATOR . $f_name . '.' . $f_type; // OPTIONAL TEST FOR ALLOWABLE EXTENSIONS if (!in_array($f_type, $file_exts)) die("Sorry, $f_type files not allowed"); // IF THERE ARE ERRORS if ($error_code != 0) { $error_message = $errors[$error_code]; die("Sorry, Upload Error Code: $error_code: $error_message"); } // GET THE FILE SIZE $file_size = number_format($my_uploaded_file["size"]); // IF THE FILE IS NEW (DOES NOT EXIST) if (!file_exists($my_new_file)) { // IF THE MOVE FUNCTION WORKED CORRECTLY if (move_uploaded_file($my_uploaded_file['tmp_name'], $my_new_file)) { $upload_success = 1; } // IF THE MOVE FUNCTION FAILED else { $upload_success = -1; } } // IF THE FILE ALREADY EXISTS else { echo "<br/><b><i>$my_file</i></b> already exists.\n"; // SHOULD WE OVERWRITE THE FILE? IF NOT if (empty($_POST["overwrite"])) { $upload_success = 0; } // IF WE SHOULD OVERWRITE THE FILE, TRY TO MAKE A BACKUP else { $now = date('Y-m-d'); $my_bak = $my_new_file . '.' . $now . '.bak'; if (!copy($my_new_file, $my_bak)) { echo "<br/><strong>Attempted Backup Failed!</strong>\n"; } if (move_uploaded_file($my_uploaded_file['tmp_name'], $my_new_file)) { $upload_success = 2; } else { $upload_success = -1; } } } // REPORT OUR SUCCESS OR FAILURE if ($upload_success == 2) { echo "<br/>It has been overwritten.\n"; } if ($upload_success == 1) { echo "<br/><strong>$my_file</strong> has been saved.\n"; } if ($upload_success == 0) { echo "<br/><strong>It was NOT overwritten.</strong>\n"; } if ($upload_success < 0) { echo "<br/><strong>ERROR: $my_file NOT SAVED - SEE WARNING FROM move_uploaded_file() COMMAND</strong>\n"; } if ($upload_success > 0) { echo "$file_size bytes uploaded.\n"; if (!chmod ($my_new_file, 0755)) { echo "<br/>chmod(0755) FAILED: fileperms() = "; echo substr(sprintf('%o', fileperms($my_new_file)), -4); } echo "<br/><a target=\"_blank\" href=\"$my_file\">See the file $my_file</a>\n"; } // END FOREACH ITERATOR - EACH ITERATION PROCESSES ONE FILE } } Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.