<?php // demo/upload_single_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
// 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 BIGGEST FILE SIZE WE CAN ACCEPT - ABOUT 8 MB
$max_file_size = '8000000';
// ESTABLISH THE KINDS OF FILE EXTENSIONS WE WANT (USE UPPERCASE ONLY)
$file_exts = array
( 'XLS'
, 'XLSX'
, 'PDF'
, 'JPG'
)
;
$f_exts = implode(', ', $file_exts);
// ESTABLISH THE NAME OF THE DESTINATION FOLDER
$my_dir = getcwd();
// OR USE THIS TO PUT UPLOADS IN A SEPARATE FOLDER
$my_dir = 'throwaway';
if (!is_dir($my_dir))
{
mkdir($my_dir);
}
// 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 INFORMATION POSTED
if (!empty($_POST))
{
// IF THERE ARE ERRORS
$error_code = $_FILES["userfile"]["error"];
if ($error_code)
{
trigger_error($errors[$error_code], E_USER_ERROR);
}
// GET THE FILE SIZE
$fsize = number_format($_FILES["userfile"]["size"]);
// SYNTHESIZE THE NEW FILE NAME FOR TEMPORARY STORAGE
$fname = basename($_FILES['userfile']['name']);
// FAIL IF THIS IS NOT AN ALLOWABLE EXTENSION
$f_ext = explode('.', $fname);
$f_ext = end($f_ext);
$f_ext = strtoupper(trim($f_ext));
if (!in_array($f_ext, $file_exts)) trigger_error("$f_ext NOT ALLOWED. CHOOSE FROM $f_exts", E_USER_ERROR);
// THE SERVER PATH TO THE FILE
$my_path
= getcwd()
. DIRECTORY_SEPARATOR
. $my_dir
. DIRECTORY_SEPARATOR
. $fname
;
// THE URL PATH TO THE FILE
$my_url
= $my_dir
. DIRECTORY_SEPARATOR
. $fname
;
// MESSAGES ABOUT THE UPLOAD STATUS, IF ANY
$msg = NULL;
// IF THE FILE IS NEW (DOES NOT EXIST)
if (!file_exists($my_path))
{
// IF THE MOVE FUNCTION WORKED CORRECTLY
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $my_path))
{
$upload_success = 1;
}
// IF THE MOVE FUNCTION FAILED IT PROBABLY THREW A MESSAGE
else
{
$upload_success = -1;
trigger_error("MOVE TO $my_path FAILED", E_USER_ERROR);
}
}
// IF THE FILE ALREADY EXISTS
else
{
$msg .= "<br/><b><i>$my_url</i></b> already exists" . PHP_EOL;
// 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-His');
$my_bak = $my_path . '.' . $now . '.bak';
if (!copy($my_path, $my_bak))
{
$msg .= "<br/><strong>Attempted Backup Failed!</strong>" . PHP_EOL;
}
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $my_path))
{
$upload_success = 2;
}
else
{
$upload_success = -1;
trigger_error("MOVE TO $my_path FAILED", E_USER_ERROR);
}
}
}
// PREPARE A REPORT OF THE SCRIPT'S SUCCESS OR FAILURE
if ($upload_success == 2) { $msg .= "<br/>A backup was made and the file was overwritten" . PHP_EOL; }
if ($upload_success == 1) { $msg .= "<br/><strong>$my_url</strong> has been saved" . PHP_EOL; }
if ($upload_success == 0) { $msg .= "<br/><strong>It was NOT overwritten.</strong>" . PHP_EOL; }
if ($upload_success < 0) { $msg .= "<br/><strong>ERROR: $my_url NOT SAVED - SEE WARNING FROM move_uploaded_file()</strong>" . PHP_EOL; }
// ADD FILE SIZE AND PERMISSION INFORMATION
if ($upload_success > 0)
{
$msg .= "<br/>$fsize bytes uploaded" . PHP_EOL;
if (!chmod ($my_path, 0755))
{
$msg .= "<br/>chmod(0755) FAILED: fileperms() = ";
$msg .= substr(sprintf('%o', fileperms($my_path)), -4);
}
}
// SHOW THE SUCCESS OR FAILURE
echo $msg;
// SHOW A LINK TO THE FILE
echo '<br/>'
. '<a href="'
. $my_url
. '" target="_blank">'
. "See: $my_url"
. '</a>'
;
}
// CREATE THE FORM FOR INPUT (USING HEREDOC SYNTAX)
$form = <<<EOF
<h2>Upload a File</h2>
<p>
<form enctype="multipart/form-data" method="post">
<!--
SOME IMPORTANT THINGS TO NOTE ABOUT THIS FORM...
ENCTYPE= ATTRIBUTE IN THE HTML <FORM> TAG
MAX_FILE_SIZE HIDDEN CONTROL MUST PRECEDE THE FILE INPUT CONTROLS
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
-->
<input type="hidden" name="MAX_FILE_SIZE" value="$max_file_size" />
Find a file to Upload ($f_exts): <input name="userfile" type="file" />
<br/>Check this box
<input autocomplete="off" type="checkbox" name="overwrite" /> to <strong>overwrite</strong> existing files
</br><input type="submit" value="Upload" />
</form>
</p>
EOF;
echo $form;