Загрузите несколько файлов в Laravel 4

Вот мой код контроллера для загрузки нескольких файлов, и я передаю ключ и значение из клиентского API клиента postman в Google Chrome. Я добавляю несколько файлов из почтальона, но загружается только один файл.

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); } } } } } 

Я также пробовал этот код, но он возвращает мне местоположение файла во временной папке

 $file = Input::file('file'); echo count($file); 

и echo count($_FILES['file']); возвращает меня всегда 5. Может ли кто-нибудь сказать мне, почему?

и почему foreach(Input::file('file') as $key => $abc) дает ошибочные аргументы ошибки

Не использовать какой-либо API, но это может обозначить принцип.

Я настроил этот файл route.php, whick поможет вам с тестом на загрузку.

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(); }); 

Обратите внимание на имя входа, файлы []: если вы загружаете несколько файлов под тем же именем, включите также скобки.

Решение:

Вы можете получить все файлы, просто сделав:

 $allFiles = Input::file(); 

Объяснение:

Ввод класса фактически является Фасад для класса Illuminate\Http\Request (Да, как и фасад Request они оба служат в качестве «Лица» для того же класса! **).

Это означает, что вы можете использовать любые методы, доступные в запросе.

Если мы ищем file() функции file() , мы видим, что он работает следующим образом:

 public function file($key = null, $default = null) { return $this->retrieveItem('files', $key, $default); } 

Теперь метод retrieveItem() является защищенным методом, поэтому мы не можем просто вызвать его непосредственно из нашего контроллера. Однако, глядя глубже, мы видим, что мы можем передать метод file() «null» для ключа. Если мы это сделаем, мы получим все предметы!

 protected function retrieveItem($source, $key, $default) { if (is_null($key)) { return $this->$source->all(); } else { return $this->$source->get($key, $default, true); } } 

Итак, если мы будем называть Input::file() , класс Request будет внутренне запускать $this->retrieveItem('files', null, null) который, в свою очередь, будет return $this->files->all(); и мы получим все загруженные файлы.

** Обратите внимание, что Input фасад имеет дополнительный метод get (), доступный в нем.

вышеупомянутые решения не будут работать с несколькими файлами, поскольку возврат будет срабатывать, как только первый элемент будет проверен, так что вот решение после нескольких часов удара головой. вдохновлен https://www.youtube.com/watch?v=PNtuds0l8bA

 // route Route::get('/', function() { return View::make('main'); }); Route::post('up', 'FUplaodController@store'); // controller class FUplaodController extends \BaseController { public function store() { if (Input::hasFile('images')) { $files = Input::file('images'); $rules = [ 'file' => 'required|image' ]; $destinationPath = public_path().'/uploads'; foreach ($files as $one) { $v = Validator::make(['file' => $one], $rules); if ($v->passes()) { $filename = $one->getClientOriginalName(); $upload_success = $one->move($destinationPath, $filename); if ($upload_success) { $done[] = $filename; Session::flash('done', $done); } } else { $filename = $one->getClientOriginalName(); $not[] = $filename; Session::flash('not', $not); } } return Redirect::back()->withErrors($v); } return Redirect::back()->withErrors('choose a file'); } } // view <!-- uploaded --> @if (Session::has('done')) @foreach (Session::get('done') as $yes) <li>{{ $yes }}</li> @endforeach <p style="color: #2ecc71">Uploaded</p> <br> @endif <!-- not uploaded --> @if (Session::has('not')) @foreach (Session::get('not') as $no) <li>{{ $no }}</li> @endforeach <p style="color: #c0392b">wasnt uploaded</p> <br> @endif <!-- errors --> <p style="color: #c0392b">{{ $errors->first() }}</p> <hr> <!-- form --> {{ Form::open(['url' => 'up', 'files'=>true]) }} {{ Form::file('images[]', ['multiple'=>true]) }} {{ Form::submit('Upload') }} {{ Form::close() }} 

u в основном сохраняйте имена файлов в массиве и передавайте эти массивы на сеанс, а затем добавляете return только после завершения цикла.

1. Форма: – Тег открытия формы должен иметь «файлы» => true, а поле файла должно иметь имя [] (с массивом) и «multiple» => true

 <?php {{ Form::open(array('url'=>'apply/multiple_upload','method'=>'POST', 'files'=>true)) }} {{ Form::file('images[]', array('multiple'=>true)) }} ?> 

2. Добавьте ниже код к функции вашего контроллера: –

 <?php // getting all of the post data $files = Input::file('images'); foreach($files as $file) { // validating each file. $rules = array('file' => 'required'); //'required|mimes:png,gif,jpeg,txt,pdf,doc' $validator = Validator::make(array('file'=> $file), $rules); if($validator->passes()){ // path is root/uploads $destinationPath = 'uploads'; $filename = $file->getClientOriginalName(); $upload_success = $file->move($destinationPath, $filename); // flash message to show success. Session::flash('success', 'Upload successfully'); return Redirect::to('upload'); } else { // redirect back with errors. return Redirect::to('upload')->withInput()->withErrors($validator); } } ?> 

ИСТОЧНИК: http://tutsnare.com/upload-multiple-files-in-laravel/