如何克服 Laravel dropzone 文件上传中的 getClientOriginalName() 错误?

Posted

技术标签:

【中文标题】如何克服 Laravel dropzone 文件上传中的 getClientOriginalName() 错误?【英文标题】:How to overcome getClientOriginalName() error in Laravel dropzone file upload? 【发布时间】:2017-05-14 15:20:10 【问题描述】:

我使用的是 Laravel 5.0,图片上传我使用的是 dropzone.js。实际上文件上传到文件夹和数据库,但它会抛出类似

的错误

在非对象上调用成员函数 getClientOriginalName() 关于 post 方法。

我哪里出错了?

查看文件,

<form  method="POST" class="dropzone dz-clickable" id="productDropzone" action="url()/cms/website/pages/upload_files" enctype="multipart/form-data">
                              <div class="dz-default dz-message">
                                <span>Drop files here to upload</span>
                              </div>
                              <input name="_token" type="hidden" value=" csrf_token() ">
                            <input type="submit" value="Upload" id="submit_all"/>
                          </form>

下面是我的js,

Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("form#productDropzone",  
    paramName : 'file',
    maxFilesize: 3, // MB
    maxFiles: 3,
    autoProcessQueue: false,
    addRemoveLinks: true,
    init: function() 
        this.on("addedfile", function(file)  fileupload_flag = 1; );
        this.on("complete", function(file)  fileupload_flag = 0; );
    ,
    accept: function(file, done) 
   
        var re = /(?:\.([^.]+))?$/;
        var ext = re.exec(file.name)[1];
        ext = ext.toUpperCase();
        if ( ext == "JPG" || ext == "JPEG" || ext == "PNG" ||  ext == "GIF" ||  ext == "BMP") 
        
            done();
        else  
            done("Please select only supported picture files."); 
        
    ,
    success: function( file, response ) 
      obj = JSON.parse(response);
      file.previewElement.querySelector("file").src = obj.src;
      // alert(obj.src);return false;
    
);
$('#submit_all').click(function()   
  myDropzone.processQueue();
);

控制器功能,

   $com_id     = Auth::user()->company_id; 

   $file = Request::file('file');
        $destinationPath = public_path() . '/images/section/';
        $filename = strtolower($file->getClientOriginalName());

        $upload_success = $file->move($destinationPath, $filename);

        if ($upload_success) 

            $upload = new Cms_banner_master();
            $upload->product_banner = json_encode($filename);
            $upload->company_id = $com_id;
            $upload->home_banner ="1";
            $upload->save();

            return Response::json(array($fileName));
             else 
            
            return Response::json('error', 400);

        

【问题讨论】:

你的标题和代码显示getClientOriginalName,但是,你错误显示getClientOriginalExtension?另外,您介意在命令行中运行composer show | grep -i "symfony/http-foundation" 并告诉我们您使用的是什么版本的http-foundation。 由于您使用的是多文件上传,您必须以数组的形式访问文件。 作曲家表演 | grep -i "symfony/http-foundation" Warning: This development build of composer is over 60 days old. It is recommended to update it by running "/usr/local/bin/composer self-update" to get the latest version. 我的作曲家版本是 Composer version 1.0-dev (72cd6afdfce16f36a9fd786bc1b2f32b851e764f) 2015-12-28 17:35:19 @JagadeshaNH, public function uploadFiles() $file = []; $com_id = Auth::user()-&gt;company_id; $file[] = Input::file('file'); 我已更改但无法正常工作。 dropzonejs.com/#config-uploadMultiple ? 【参考方案1】:

如果你想防止错误发生,你可以先对文件添加一些有效性检查。

例如使用 isValid 方法

更新:我也添加了 hasFile 方法。

if(Request::hasFile('file') 
    $file = Request::file('file');

    if($file->isValid()) 
        $destinationPath = public_path() . '/images/section/';
        $filename = strtolower($file->getClientOriginalName());

        $upload_success = $file->move($destinationPath, $filename);

        if ($upload_success) 
            ...
        
    
 else 
    return Response::json('No file uploaded', 409);

我还会为上传的文件生成一个新名称,这样你就不需要 getClientOriginalName:

$filename = $com_id.'_'.date('YmdHis')'.'.$file->guessExtension();

本着“永远不要信任用户”的精神,不要让他们从您将保存在服务器上的文件中“选择”文件名。

【讨论】:

如果文件存在,那么只有你可以检查 $file->isValid(),但查看错误,请求中不存在文件本身。 @Hans Vn,同样的错误还在继续。我认为js文件成功功能有什么错误吗? @Mohan,您能否发布转储并从请求中删除( dd(Request::all()); ),或者您可以检查转储中的文件是否存在。 -- 我还更新了代码示例,以便更容易调试您的问题。

以上是关于如何克服 Laravel dropzone 文件上传中的 getClientOriginalName() 错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dropzone 和 Laravel 获取要上传的图像

Dropzone 在本地主机上正常工作,在远程服务器上引发错误

如何在 Dropzone 上传请求的标头中包含 CSRF 令牌?

Dropzone CSRF令牌不匹配Laravel 5

使用 dropzone.js 和 laravel 5 验证 CsrfToken

Dropzone多个文件上传不适用于Excel文件