Here is my controller code for uploading multiple files and I am passing key and value from 'postman' rest API client on Google Chrome. I am adding multiple files from postman but only 1 file is getting upload.
public function post_files() {
$allowedExts = array("gif", "jpeg", "jpg", "png","txt","pdf","doc","rtf","docx","xls","xlsx");
foreach($_FILES['file'] as $key => $abc) {
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
$filename= $temp[0];
$destinationPath = 'upload/'.$filename.'.'.$extension;
if(in_array($extension, $allowedExts)&&($_FILES["file"]["size"] < 20000000)) {
if($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
if (file_exists($destinationPath)) {
echo $filename." already exists. ";
} else {
$uploadSuccess=move_uploaded_file($_FILES["file"]["tmp_name"],$destinationPath);
if( $uploadSuccess ) {
$document_details=Response::json(Author::insert_document_details_Call($filename,$destinationPath));
return $document_details; // or do a redirect with some message that file was uploaded
// return Redirect::to('authors')
} else {
return Response::json('error', 400);
}
}
}
}
}
I have tried this code also but it returns me location of a file in temporary folder
$file = Input::file('file');
echo count($file);
and
echo count($_FILES['file']);
returns me always 5.Can anyone tell me why?
and why foreach(Input::file('file') as $key => $abc)
gives the error invalid arguments
You can get all files by simply doing:
$allFiles = Input::file();
The class Input
is actually a Facade for the Illuminate\Http\Request
class (Yes, just like the Request
facade - they both serve as the "Face" for the same class!**).
That means you can use any methods available in Request .
If we search for the function file()
, we see it works like this:
public function file($key = null, $default = null)
{
return $this->retrieveItem('files', $key, $default);
}
Now, retrieveItem()
is a protected method, so we can't just call it from our Controller directly. Looking deeper, however, we see that we can pass the file()
method "null" for the key. If we do so, then we'll get all the items!
protected function retrieveItem($source, $key, $default)
{
if (is_null($key))
{
return $this->$source->all();
}
else
{
return $this->$source->get($key, $default, true);
}
}
So, if we call Input::file()
, the Request class will internally run $this->retrieveItem('files', null, null)
which will in turn run return $this->files->all();
and we will get all the files uploaded.
** Note that Input
Facade has the extra method get() available in it.
Not using any API, but this might outline the principle.
I set up this routes.php file, whick will help you with upload test.
routes.php
// save files
Route::post('upload', function(){
$files = Input::file('files');
foreach($files as $file) {
// public/uploads
$file->move('uploads/');
}
});
// Show form
Route::get('/', function()
{
echo Form::open(array('url' => 'upload', 'files'=>true));
echo Form::file('files[]', array('multiple'=>true));
echo Form::submit();
echo Form::close();
});
Notice the input name, files[]: If uploading multiple files under the same name, include brackets as well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With