在Laravel 4中上传多个文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Laravel 4中上传多个文件相关的知识,希望对你有一定的参考价值。
这是我用于上传多个文件的控制器代码,我从Google Chrome上的'postman'rest API客户端传递密钥和值。我正在从邮递员添加多个文件,但只有1个文件正在上传。
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,但这可能概述了原则。
我设置了这个routes.php文件,它可以帮助你进行上传测试。
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();
});
注意输入名称files []:如果以相同的名称上传多个文件,也包括括号。
解:
您只需执行以下操作即可获取所有文件:
$allFiles = Input::file();
说明:
课程Input
实际上是Illuminate\Http\Request
课程的门面(是的,就像Request
门面一样 - 它们都是同一个班级的“面孔”!**)。
这意味着您可以使用Request中的任何可用方法。
如果我们搜索函数file()
,我们看到它的工作原理如下:
public function file($key = null, $default = null)
{
return $this->retrieveItem('files', $key, $default);
}
现在,retrieveItem()
是一个受保护的方法,所以我们不能直接从我们的Controller中调用它。然而,从更深层次看,我们看到we can pass the file()
method "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()
,请求类将在内部运行$this->retrieveItem('files', null, null)
,然后运行return $this->files->all();
,我们将获取所有上传的文件。
**请注意,Input
Facade有额外的方法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() }}
你基本上将文件名保存在一个数组中,并将这些数组传递给一个会话,然后只在循环结束时添加return
。
1.表单: - 表单开始标记必须有'files'=> true,文件字段必须有name [](带数组)和'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/
编辑:参考源链接不起作用。
以上是关于在Laravel 4中上传多个文件的主要内容,如果未能解决你的问题,请参考以下文章