如何克服 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()->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 令牌?