Как мне пройти проверку массива загруженных файлов в Laravel 4? Я установил его в форме, чтобы разрешить несколько файлов, и я протестировал, что файлы существуют в массиве Input :: file ('files'). Но как я могу проверить каждый файл?
Вот что я пробовал:
$notesData = array( 'date' => Input::get('date'), 'files' => Input::file('files') ); // Declare the rules for the form validation. $rules = array( 'date' => 'Required|date_format:Ym-d', 'files' => 'mimes:jpeg,bmp,png,pdf,doc' ); // Validate the inputs. $validator = Validator::make($notesData, $rules); // Check if the form validates with success. if ($validator->passes()) { // Redirect to homepage return Redirect::to('')->with('success', 'Validation passed!'); } // Something went wrong. return Redirect::to(URL::previous())->withErrors($validator)->withInput(Input::all());
Я ожидал, что Validator будет жаловаться на передачу массива файлов внутри массива данных, но он просто прошел проверку, хотя файл, который я отправил, был mp3. Когда я попытался загрузить несколько файлов, он дал несвязанную ошибку, что поле даты требуется (хотя поле даты было автопопулено).
Я довольно новичок в Laravel. Что я могу сделать, чтобы заставить это работать?
ОБНОВЛЕНИЕ: Я понял, что частью проблемы был мой upload_max_filesize и post_max_size, который я исправил. Я также пытался динамически добавлять файлы в массивы так:
$notesData = array( 'date' => Input::get('date') ); $i=0; foreach(\Input::file('files') as $file){ $notesData['file'.++$i] = $file; } // Declare the rules for the form validation. $rules = array( 'date' => 'Required|date_format:Ymd' ); for($j=1; $j<=$i; $j++){ $rules['file'.$j] ='mimes:jpeg,bmp,png,doc'; }
Но теперь я получаю следующую ошибку:
Сериализация «Symfony \ Component \ HttpFoundation \ File \ UploadedFile» не допускается
И я потерян. Любая идея, как это исправить?
Я думаю, это в основном ваше первоначальное решение. Для любого, кто все еще запутался, вот код, который работал для меня …
// Handle upload(s) with input name "files[]" (array) or "files" (single file upload) if (Input::hasFile('files')) { $all_uploads = Input::file('files'); // Make sure it really is an array if (!is_array($all_uploads)) { $all_uploads = array($all_uploads); } $error_messages = array(); // Loop through all uploaded files foreach ($all_uploads as $upload) { // Ignore array member if it's not an UploadedFile object, just to be extra safe if (!is_a($upload, 'Symfony\Component\HttpFoundation\File\UploadedFile')) { continue; } $validator = Validator::make( array('file' => $upload), array('file' => 'required|mimes:jpeg,png|image|max:1000') ); if ($validator->passes()) { // Do something } else { // Collect error messages $error_messages[] = 'File "' . $upload->getClientOriginalName() . '":' . $validator->messages()->first('file'); } } // Redirect, return JSON, whatever... return $error_messages; } else { // No files have been uploaded }
Ну, я не совсем уверен, что вызвало ошибку, но, немного поиграв с валидатором, я понял, что не могу просто передать все файлы сразу. Вместо этого я создал новый массив, который ассоциировал каждый файл с файлами «file0», «file1» и т. Д. Затем я передал их в валидатор и установил правила для каждого из них (используя цикл foreach). Затем валидатор работал должным образом. Тем не менее, он не был достаточно гибким для моих нужд, и я в конечном итоге использовал не-laravel решение.
Это может быть не прямой ответ на ваш вопрос, но вы можете сделать простую проверку правильности таких типов:
$file = Input::file('files'); switch($file->getClientMimeType()){ case 'application/pdf': // upload stuff break; }
foreach(Request::file('photos') as $key => $value) { $rules['photos.'.$key]="mimes:jpeg,jpg,png,gif|required|max:10000"; $friendly_names['photos.'.$key]="photos"; }
неforeach(Request::file('photos') as $key => $value) { $rules['photos.'.$key]="mimes:jpeg,jpg,png,gif|required|max:10000"; $friendly_names['photos.'.$key]="photos"; }
Это сработало для меня в Laravel 5.2