在Laravel 4中上传多个文件

问题描述 投票:8回答: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)给错误无效的参数

php file upload laravel
4个回答
22
投票

不使用任何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 []:如果以相同的名称上传多个文件,也包括括号。


21
投票

解:

您只需执行以下操作即可获取所有文件:

$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()


3
投票

上述解决方案不适用于多个文件,因为一旦第一个项目得到验证,返回就会触发,所以这是一个解决了几个小时的头墙撞击之后的解决方案。灵感来自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
投票

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/

编辑:参考源链接不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.