Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload multiple files in Laravel 4

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

like image 746
richa Avatar asked Aug 13 '13 08:08

richa


2 Answers

Solution:

You can get all files by simply doing:

$allFiles = Input::file();

Explanation:

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.

like image 98
fideloper Avatar answered Oct 24 '22 02:10

fideloper


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.

like image 21
Andreyco Avatar answered Oct 24 '22 02:10

Andreyco