File uploading is one of the most commonly used features in form programming. FuelPHP provides a special class, Upload to handle uploading of files. Let us learn how to upload a file using Upload class in this chapter.
Upload class can be configured using separate configuration file, fuel/app/config/upload.php. The important configuration entries are as follows −
max_size − Set the maximum size of the file to be uploaded. “0” refers unlimited upload size
ext_whitelist − Set allowed file extensions
ext_blacklist − Set disallowed file extensions
type_whitelist − Set allowed file types. For example, “text” for mime type “text/plain”
type_blacklist − Set disallowed file types
mime_whitelist − Set allowed mime file types. For example, “text/plain”
mime_blacklist − Set disallowed mime file types
prefix − String to prefix in the filename while saving the uploaded file to the server
suffix − String to suffix in the filename while saving the uploaded file to the server
extension − Extension of the uploaded file to be set
create_path − Whether to create the file path, if not available
overwrite − Whether to overwrite the existing file while saving the uploaded file
auto_rename − Whether to rename the file by adding a sequence number while saving the uploaded file
randomize − Whether to create a random 32-character name to save the uploaded file
Upload class provides options to process and save the file uploaded by the users. Every processed file (before saving) will have the following information in the result array.
field − Name of the form field
name − Name of the file uploaded
type − Type of the file as defined by the browser
mimetype − Type of the file as defined by Upload class
file − Fully qualified name of the temporary location of the uploaded file
filename − Filename of the uploaded file
extension − Extension of the file uploaded
size − Size of the file uploaded in bytes
errors − Array of error having error code and message
error − Whether to set array errors with why the upload fails (in case of failure in upload)
Once the files are saved in the server, the result array will have the following information as well.
saved_to − Fully qualified path where the uploaded file was saved
saved_as − Name of the file that was saved
errors − Updated error array
Now, let us see the method of Upload class.
is_valid returns true, if any valid file is uploaded by the user.
// do we have any uploaded files to save? if (Upload::is_valid()) { // process }
get_files return all the uploaded files as multi-dimensional array. If an index/name of the form's file input is specified, then it will return the uploaded file related to the specified file input only.
foreach(Upload::get_files() as $file) { // do something with the file info } if ( Upload::get_files(0)) { // do something }
get_errors returns an array of errors, if there is a failure to upload one or more files. If an index/name of the form's file input name is specified, then it will return the error related to the specified file input only.
foreach(Upload::get_errors() as $file) { // do something with the file info } if (Upload::get_errors('myimage')) { // do something }
process refers to the actual process of gathering information about the uploaded file. We can supply a new custom configuration using array. If no configuration is specified, then it will use the configuration defined in fuel/app/config/upload.php
Upload::process (array( 'auto_rename' => false, 'overwrite' => true ));
save refers to the actual process of saving all the validated files in a proper location. We can specify the index to save only that particular entry.
Upload::save(); Upload::save(0); Upload::save(0, 3);
Let us create a new controller, Controller_Upload in our employee sample to test the upload functionality.
Step 1 − Create a file, fuel/app/classes/controller/upload.php. Create upload controller.
<?php class Controller_Upload extends Controller { }
Step 2 − Create a new action get_upload.
<?php class Controller_Upload extends Controller { public function get_index() { return \View::forge("upload/index"); } }
Step 3 − Create a new view for the action created.
<!DOCTYPE html> <html> <body> <form action = "/upload/index" method = "post" enctype = "multipart/form-data"> Select image to upload: <input type = "file" name = "fileToUpload" id = "fileToUpload"> <input type = "submit" value = "Upload Image" name = "submit"> </form> </body> </html>
Step 4 − Create a new action post_action to process the uploaded file.
<?php class Controller_Upload extends Controller { public function get_index() { return \View::forge("upload/index"); } public function post_index(){ $config = array( 'path' => DOCROOT.'files', 'randomize' => true, 'ext_whitelist' => array('img', 'jpg', 'jpeg', 'gif', 'png'), ); Upload::process($config); // if there are any valid files if (Upload::is_valid()) { Upload::save(); echo "success"; } else { // and process any errors foreach (Upload::get_errors() as $file) { echo var_dump($file); } } } }
Finally, run the application by requesting the url, http://localhost:8080/upload/index and try to upload file.