Okay, here it is but I hope the formatting isn’t too messed up in the process. One endif; seemed to want to keep getting lost.
The basic test HTML form.
<h3>Test FIle Upload</h3>
<form method="POST" name="images" id="images" action="<?=$submitFormAction;?>" enctype="multipart/form-data">
<input type="file" name="UploadFile" id="UploadFile" multiple> <input name="FileUpload" type="submit" value="Upload File(s)">
<input type="hidden" name="OldImage" value="">
<input type="hidden" name="ImageUpload" value="1" id="ImageUpload">
</form>
Setup array in the form script. The message(Alert() function called at the end simply generates any message in a JavaScript popup.
if (isset($_FILES['UploadFile']) && isset($_FILES)) :
// UseSub IS FOR SUBFOLDER NAME SUCH AS THE ID OR SPECIFIC NAME
// THIS FOLDER, IF ANY, IS UNDER THE SITE-WIDE $ImagePath FOLDER
// UseDB TO BE COMMA-SEPARATED LIST THAT INCLUDES TABLE NAME AND FIELDS
// PDF UPLOADING IS NOT YET ENABLED
$ImageSetup = [
'BasePath' => $ImagePath,
'PDFPath' => $PDFPath,
'UseSub' => '',
'SaveOriginal' => 'original',
'SaveThumbnail' => 'thumbnail',
'PDFFolder' => '',
'AllowedFormats' => 'jpg, jpeg, png, gif, bmp, tif, tiff, heic, pdf',
'KeepFormat' => 'jpg, jpeg, png, pdf',
'DefaultFormat' => 'png',
'UseDB' => '',
'MaxWidth' => 640,
'MaxHeight' => 0,
'ThumbWidth' => 150,
'ThumbHeight' => 0,
'MaxSize' => 150000000
];
$Message = imageUpload($ImageSetup);
messageAlert($Message);
endif;
The function itself but in spite its name, it uploads only the original files, not the resized copies.
function imageUpload($Values) {
// CREATE UNDERSCORED VARIABLES FROM $Values ARRAY
foreach ($Values as $row => $val) :
if (is_string($row)) :
${'_'.$row} = $val;
endif;
endforeach;
// BEGIN CREATE FOLDERS
// CREATE BASE IMAGE SUBFOLDER IF NEEDED
if (isset($_UseSub) && $_UseSub !== "") :
$SubPath = "{$_BasePath}$_UseSub". DIRECTORY_SEPARATOR;
// ADD SUBFOLDER FOR ENTRY IMAGES WHICH MAY BE NAME OR DATABASE ENTRY ID
if (!file_exists($SubPath)) :
mkdir($SubPath, 0775, true);
endif;
else :
$SubPath = $_BasePath;
endif;
// CREATE THUMBNAIL FOLDER IF NEEDED
if (isset($_SaveThumbnail) && $_SaveThumbnail !== "") :
$ThumbPath = "{$SubPath}$_SaveThumbnail". DIRECTORY_SEPARATOR;
// ADD THUMBNAIL PATH (CREATE IF NECESSARY) AND RESIZE IMAGE
if (!file_exists($ThumbPath)) :
mkdir($ThumbPath, 0775, true);
endif;
else :
$ThumbPath = "";
endif;
// CREATE FOLDER FOR SAVING ORIGINAL FILE
if (isset($_SaveOriginal) && $_SaveOriginal !== "") :
$OriginalPath = "{$SubPath}$_SaveOriginal". DIRECTORY_SEPARATOR;
// ADD ORIGINAL PATH (CREATE IF NECESSARY) BUT DO NOT RESIZE IMAGE
if (!file_exists($OriginalPath)) :
mkdir($OriginalPath, 0775, true);
endif;
else :
$OriginalPath = "";
endif;
// CREATE FOLDER FOR SAVING PDF FILES
// NOTE TO SELF: PDFs ARE NOT CURRENTLY BEING UPLOADED
if (isset($_PDFPath) && isset($_PDFFolder) && $_PDFPath !== "" && $_PDFFolder !== "") :
$PDFPath = "{$_PDFPath}$_PDFFolder". DIRECTORY_SEPARATOR;
// ADD ORIGINAL PATH (CREATE IF NECESSARY) BUT DO NOT NOT AN IMAGE SO DO NOT RESIZE
if (!file_exists($PDFPath)) :
mkdir($PDFPath, 0775, true);
endif;
else :
$PDFPath = "";
endif;
// END CREATE FOLDERS
// BEGIN CREATE SOME VARIABLES
// GET VALUE OF $_AllowedFormats AND MAKE INTO AN ARRAY
$AllowedFormats = array_map("trim", explode(',', $_AllowedFormats));
// INITIALIZE VARIABLE, ASSUME VALID BEFORE CHECKING
$uploadValid = 1;
$Error = "of an undetermined problem";
// CREATE VARIABLE FOR FILE NAME
$targetFile = $_FILES["UploadFile"]["name"];
$targetFile = strtolower($targetFile);
// CREATE VARIABLE FOR FILE TYPE
// DO NOT CHANGE FORMAT OF JPG OR PDF FILES
$imageFileType = pathinfo($targetFile, PATHINFO_EXTENSION);
$imageFileType = strtolower($imageFileType);
$KeepFormat = array_map("trim", explode(',', $_KeepFormat));
$_DefaultFormat = (in_array($imageFileType, $KeepFormat)) ? $imageFileType : $_DefaultFormat;
// END CREATE SOME VARIABLES
// BEGIN CHECK VALIDITY OF SUBMITTED FILE
// CHECK IF THE UPLOAD FILE IS AN ACTUAL IMAGE
if (isset($_POST["submit"])) :
$check = getimagesize($_FILES["UploadFile"]["tmp_name"]);
if ($check !== FALSE) :
$Message = "The file is a " . $check["mime"] . " image.";
$uploadValid = 1;
else :
$Error = "it is not an image.";
$uploadValid = 0;
endif;
endif;
// NOTE TO SELF: FIX CASE ISSUE
if (!is_dir($SubPath)) :
// CHECK IF THE UPLOAD DIRECTORY EXISTS
// IT SHOULD HAVE BEEN CREATED ABOVE
$Error = "the image directory does not exist.";
$uploadValid = 0;
elseif (strtolower(file_exists($targetFile))) :
// CHECK IF FILE ALREADY EXISTS
$Error = "it already exists.";
$uploadValid = 0;
elseif ($_FILES['UploadFile']['size'] == 0) :
// CHECK THAT THE FILE CONTAINS DATA
$Error = "it contains no data.";
$uploadValid = 0;
elseif ($_FILES["UploadFile"]["size"] > $_MaxSize) :
// CHECK IF FILE IS WITHIN MAXIMUM SIZE
$Error = "it is too large.";
$uploadValid = 0;
elseif (!in_array($imageFileType, $AllowedFormats)) :
// ALLOW ONLY SPECIFIC FILE FORMATS
$_AllowedFormats = preg_replace("/,([^,]+)$/", " & $1", $_AllowedFormats);
$Error = "only $_AllowedFormats files are allowed.";
$uploadValid = 0;
endif;
// END CHECK VALIDITY OF SUBMITTED FILE
// BEGIN FINAL CHECK, FILE PROCESSING AND UPLOADING
// CHECK IF $uploadValid IS TRUE AND IF IT IS, UPLOAD THE FILE
if ($uploadValid == 0) :
$Message = "Sorry, the file was not processed because $Error";
else :
$Message = "The file has been processed.";
// PROCESS AND SAVE IMAGES TO FOLDERS SPECIFIED IN $Values
if (isset($SubPath) && $SubPath !== "") :
$FileName = basename(imageResize($SubPath, $_DefaultFormat, $_MaxWidth, $_MaxHeight));
$Size = ($_MaxWidth > 0) ? "$_MaxWidth wide" : "$_MaxHeight high";
$Message .= " A new reduced size image $FileName of $Size was uploaded. ";
endif;
// PROCESS AND SAVE THE THUMBNAIL
if (isset($ThumbPath) && $ThumbPath !== "") :
$FileName = imageResize($ThumbPath, $_DefaultFormat, $_ThumbWidth, $_ThumbHeight);
$Size = ($_ThumbWidth > 0) ? "$_ThumbWidth wide" : "$_ThumbHeight high";
$Message .= " A new thumbnail image of $Size was created.";
endif;
// SAVE THE ORIGINAL IMAGE
// MOVED TO THE LAST DUE TO move_uploaded_file() DELETED TEMP FILE
if (isset($OriginalPath) && $OriginalPath !== "") :
$ImageInfo = $_FILES["UploadFile"]["tmp_name"];
move_uploaded_file($_FILES["UploadFile"]["tmp_name"],$OriginalPath.$_FILES["UploadFile"]["name"]);
$Message .= " A copy of the original image ". $_FILES["UploadFile"]["name"] ." was uploaded. ";
endif;
//return "The file ". htmlspecialchars(basename($_FILES['UploadFile']['name'])). " has been uploaded and $NewImage created.";
endif;
return $Message;
// END FILE PROCESSING AND UPLOADING
}
The imageResize() function does the actual uploading except for the original copies which are done in the function above.
// USE IMAGEMAGICK TO RESIZE IMAGE
function imageResize($TargetDir, $ImageFormat, $MaxWidth, $MaxHeight) {
$TargetFile = pathinfo($_FILES['UploadFile']['name'], PATHINFO_FILENAME);
$TargetFile = strtolower($TargetFile);
$imagick = new Imagick($_FILES['UploadFile']['tmp_name']);
$imagick->setImageColorspace(imagick::COLORSPACE_SRGB);
$imagick->setImageFormat($ImageFormat);
$imagick->resizeImage($MaxWidth, $MaxHeight, Imagick::FILTER_LANCZOS, 1);
$imagick->setFilename($TargetFile);
$TargetFile = "$TargetDir{$TargetFile}.$ImageFormat";
$imagick->writeImage($TargetFile);
return $TargetFile;
}