最近在自己新建的博客后台中使用Editor.md作为发布文章的编辑器,后来在做上传图片的时候遇到了一些难题,就是提交的表单中没有Token,无法通过Laravel的VerifyCsrfToken中间件检查。本文将讲解如何解决这个问题。
Github下载地址:https://github.com/pandao/editor.md
/* 配置editormd */
var editor = editormd("editormd", {
path: "{{ asset('/editor.md/lib/') }}",
height: 700,
syncScrolling: "single",
toolbarAutoFixed: false,
saveHTMLToTextarea: false,
imageUpload: true,
imageFormats : ["jpg","jpeg","gif","png","bmp","webp"],
imageUploadURL:"{{url('backend/uploadimage')}}"
});
public function uploadimage(Request $request)
{
$message='';
if (!$this->disk->exists('/article')) {
$message = "article 文件夹不存在,请先创建";
}else{
$pathDir=date('Ymd');
if(!$this->disk->exists('/article/'.$pathDir)){
$this->disk->makeDirectory('/article/'.$pathDir);
}
}
if($request->file('editormd-image-file')){
$path="uploads/article/".$pathDir;
$pic = $request->file('editormd-image-file');
if($pic->isValid()){
$newName=md5(time() . rand(0, 10000)).".".$pic->getClientOriginalExtension();
if($this->disk->exists($path.'/'.$newName)){
$message = "文件名已存在或文件已存在";
}else{
if($pic->move($path,$newName)){
$url = asset($path.'/'.$newName);
}else{
$message="系统异常,文件保存失败";
}
}
}else{
$message = "文件无效";
}
}else{
$message="Not File";
}
$data = array(
'success' => empty($message) ? 1 : 0, //1:上传成功 0:上传失败
'message' => $message,
'url' => !empty($url) ? $url : ''
);
header('Content-Type:application/json;charset=utf8');
exit(json_encode($data));
}
Route::group(['prefix' => 'backend'], function () {
Route::post('uploadimage',['uses'=>'Backend\UploadController@uploadimage']);
});
我们可以发现会出现500错误,这是由Laravel 的TokenMismatchException异常导致的,也就是Laravel默认开启了防CSRF,而Editor.md 的上传表单中并没有包含token,所以才会出现这个错误。
当我们点击上传图片的时候会弹出上传框,这个就是上传的表单,我们可以用调试器查出这是请求了image-dialog.js,具体路径为editor.md/plugins/image-dialog/image-dialog.js。我们可以对其中的var dialogContent变量进行就修改。
具体的修改代码
if (settings.crossDomainUpload)
{
action += "&callback=" + settings.uploadCallbackURL + "&dialog_id=editormd-image-dialog-" + guid;
}
var csrfToken = $('meta[name="_token"]').attr('content');
var csrfField = "";
if (csrfToken) {
csrfField = "";
}
var dialogContent = ( (settings.imageUpload) ? "
<meta name="_token" content="{{ csrf_token() }}"/>
这样再次请求上传图片就可以把token带过去。
原文链接:http://blog.kesixin.xin/article/51