You may access
uploaded files using the
file() method or using dynamic properties (
$request->field_name).
$file = $request->file('photo');
//Or:
$file = $request->photo;
Checking if a file for upload
You may determine if a file is present on the request using the
hasFile() method.
In addition to checking if the file is present, you can also check whether the file was successfully received by using the
isValid() method
if($request->hasFile('photo') && $request->file('photo')->isValid('photo')){
//
}
UploadedFile class instance
The file() method returns an instance of the
Illuminate\Http\UploadedFile class (which extends the PHP
SplFileInfo class), and provides a variety of methods to inspect and interact with the file.
- getMimeType() - Returns the mime type of the file.
- getClientOriginalName() - Returns the original file name.
- getClientSize() - Returns the file size.
- getError() - Returns the upload error number.
- getClientOriginalExtension() - Returns the original file extension.
- guessExtension() - Returns the extension based on the mime type.
- isValid() - Returns True if the file was uploaded successfully.
- move($directory, $newName = null) - Moves the file to a new location.
For more information regarding these methods, check out the
UploadedFile class methods
- Example,
simple Laravel script to upload images, with setings for maximum allowed file size and file extension validation.
1. Create an "
uploads" folder in the "
public/" directory.
2. Add the following code in a "
UploadController.php" file (in
app/Http/Controllers/ directory):
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UploadController extends Controller {
protected $exts =['bmp', 'gif', 'jpe', 'jpeg', 'jpg', 'png']; //allowed file exttensions
protected $max_size =0.5; //allowed maximum file size in MB
protected $dir ='uploads'; //folder for uploaded files (in public/ directory)
protected $err =[]; //store errors
//Responds to post requests to /upload/photo
//receives the $request instance
//return string
public function uploadPhoto(Request $request){
//if file is sent
if($request->hasFile('photo')){
$file = $request->file('photo');
//if file successfully received
if($file->isValid()){
//validate the file
$ext = $file->guessExtension();
$size = $file->getClientSize();
if(!in_array($ext, $this->exts)) $this->err[] ='File extension: '. $ext .'<br>Allowed file exttensions: '. implode(', ', $this->exts);
if($size >$this->max_size*1024*1024) $this->err[] ='File extension: '. $size .'<br>Allowed maximum file size: '. $this->max_size .' MB';
//if no error, move the file
if(count($this->err)==0){
$fname = $file->getClientOriginalName();
$fmoved = $file->move(base_path() .'/public/'. $this->dir, $fname);
//if successfully moved in uploads directory
if($fmoved){
return 'File successfully uploaded:<br>'. $this->dir .'/'. $fname .'<br><img src="/'. $this->dir .'/'. $fname .'" alt="Photo" />';
}
else $this->err[] ='Unable to move the file to: '. $this->dir .'/'. $fname;
}
}
else $this->err[] ='The file not received';
}
else $this->err[] ='No photo file';
if(count($this->err) >0) return implode('<br>', $this->err);
}
}
3. Add the following code in a file "
upload_form.blade.php" (in the "
resources/views/" folder):
<h4>Upload Photo<h4>
<form method="post" action="/upload/photo" enctype="multipart/form-data">
{{ csrf_field() }}
File: <input type='file' name='photo'/><br>
<input type='submit' value='Upload'/>
</form>
4. Add the this code in the "
routes/web.php" file:
//shows the upload form
Route::name('upload')->get('/upload', function(){
return view('upload_form');
});
//when the upload form is submited
Route::post('/upload/photo', 'UploadController@uploadPhoto');
5. Visit the following URL, and select a file for upload:
//localhost:8000/upload
- It will display a page like in this image:
6. Click Upload button, it will open a page with the uploaded image, as shown in the following image:
Another way to save the uploaded files on server is to use the
store('folder') or
storeAs('folder', 'file_name.ext') method.
These methods store the files in the specified "folder" in the "
storage/app" directory.
The
store() method automatically generate a unique ID for the file name.
The
storeAs() method receives a second argument for the name of the file.
- Example:
//store the uploaded 'photo' file in storage/app/uploads/
//with a unique generated name
$path = $request->photo->store('uploads');
echo $path; // uploads/wAwyYljmEkjHaucksuHM2luPiyUMNApmKrt1L3LK.png
//with the original file name
$fname = $request->photo->getClientOriginalName();
$path = $request->photo->storeAs('uploads', $fname);
echo $path; // uploads/image.png