This is the function I use to allow our staff to upload product images, it uploads the full size image and two smaller images (I only included the code for one here the tn_ version). It takes the values it does because it's in my controller and can be called from multiple places. $control is the name of the fileUpload control you're using, $path is the save path, $imageName is the from the control and sizes just allows me to specify which versions to make, in my case it receives all, med and tn as options. You could make as many or as few as you need. As VDP mentioned you're limited to under 2mb if you don't change any settings but that's fine for me so I just return an error if it's over that.
I don't use the CI image upload library at all btw. It's just sent to the controller via a normal file upload and ajax. It uses an iframe on the main view to display errors or success.
My Controller upload function:
function doUpload($control, $path, $imageName, $sizes)
{
if( ! isset($_FILES[$control]) || ! is_uploaded_file($_FILES[$control]['tmp_name']))
{
print('No file was chosen');
return FALSE;
}
if($_FILES[$control]['size']>2048000)
{
print('File is too large ('.round(($_FILES[$control]["size"]/1000)).'kb), please choose a file under 2,048kb');
return FALSE;
}
if($_FILES[$control]['error'] !== UPLOAD_ERR_OK)
{
print('Upload failed. Error code: '.$_FILES[$control]['error']);
Return FALSE;
}
switch(strtolower($_FILES[$control]['type']))
{
case 'image/jpeg':
$image = imagecreatefromjpeg($_FILES[$control]['tmp_name']);
move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName);
break;
case 'image/png':
$image = imagecreatefrompng($_FILES[$control]['tmp_name']);
move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName);
break;
case 'image/gif':
$image = imagecreatefromgif($_FILES[$control]['tmp_name']);
move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName);
break;
default:
print('This file type is not allowed');
return false;
}
@unlink($_FILES[$control]['tmp_name']);
$old_width = imagesx($image);
$old_height = imagesy($image);
//Create tn version
if($sizes=='tn' || $sizes=='all')
{
$max_width = 100;
$max_height = 100;
$scale = min($max_width/$old_width, $max_height/$old_height);
if ($old_width > 100 || $old_height > 100)
{
$new_width = ceil($scale*$old_width);
$new_height = ceil($scale*$old_height);
} else {
$new_width = $old_width;
$new_height = $old_height;
}
$new = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new, $image,0, 0, 0, 0,$new_width, $new_height, $old_width, $old_height);
switch(strtolower($_FILES[$control]['type']))
{
case 'image/jpeg':
imagejpeg($new, $path.'tn_'.$imageName, 90);
break;
case 'image/png':
imagealphablending($new, false);
imagecopyresampled($new, $image,0, 0, 0, 0,$new_width, $new_height, $old_width, $old_height);
imagesavealpha($new, true);
imagepng($new, $path.'tn_'.$imageName, 0);
break;
case 'image/gif':
imagegif($new, $path.'tn_'.$imageName);
break;
default:
}
}
imagedestroy($image);
imagedestroy($new);
print '<div style="font-family:arial;"><b>'.$imageName.'</b> Uploaded successfully. Size: '.round($_FILES[$control]['size']/1000).'kb</div>';
}
View HTML:
echo '<input type="file" name="manuLogoUpload" id="manuLogoUpload" onchange="return ajaxFileUpload2(this);"/>';
View ajax call:
function ajaxFileUpload2(upload_field)
{
var re_text = /\.jpg|\.gif|\.jpeg|\.png/i;
var filename = upload_field.value;
var imagename = filename.replace("C:\\fakepath\\","");
if (filename.search(re_text) == -1)
{
alert("File must be an image");
upload_field.form.reset();
return false;
}
upload_field.form.action = "addManufacturerLogo";
upload_field.form.target = "upload_iframe";
upload_field.form.submit();
upload_field.form.action = "";
upload_field.form.target = "";
document.getElementById("logoFileName").value = imagename;
document.getElementById("logoFileName1").value = imagename;
document.getElementById("manuLogoText").style.display="block";
document.getElementById("logoLink").style.display="none";
$.prettyPhoto.close();
return true;
}
Regular controller function:
function addManufacturerLogo()
{
$control = 'manuLogoUpload';
$image = $_FILES[$control]['name'];
if($imageName = $this->doUpload($control,LOGO_PATH,$image,'all'))
{
} else {
}
}
config/constants.php << for the LOGO_PATH. Change these (and the name) to suit your purposes. The reasoning is if I ever change where I want to save images I change it in the constants rather than in 10 places throughout my application.
define('LOGO_PATH',APPPATH.'assets/images/manulogos/');
define('PROD_IMAGE_PATH',APPPATH.'../assets/images/prod_images/');