Laravel 5.2 ajax VerifyCsrfToken.php 第 67 行中的上传进度条和 TokenMismatchException
Laravel 5.2 ajax upload progress bar and TokenMismatchException in VerifyCsrfToken.php line 67
我正在尝试在图片上传中集成进度条。当我使用 PHP 提交表单时,我的代码工作正常,但是当我将 javascript 包含在进度条中时,我收到错误 "TokenMismatchException in VerifyCsrfToken.php line 67"。这是我的表格:
{!! Form::open(array('files' => true, 'class' => 'form', 'route' => ['backend.posts.uploadimage', $post->id])) !!}
<div class="form-group">
{!! Form::file('image', ['id' => 'image']) !!}
</div>
<hr>
<input type="button" value="Upload Image" class="btn btn-info btn-sm" onclick="uploadImage()">
{!! Form::close() !!}
此表单使用令牌生成隐藏输入字段:
<input name="_token" type="hidden" value="jGQWC2GljiSeZrL8wvfMaH490xHOh727345U6HzK">
我的 javascript 代码是这样的:
function uploadImage()
{
var file = document.getElementById("image").files[0];
var id = {{ $post->id }};
var formdata = new FormData();
formdata.append("image", file);
var ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress", progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("post", "{{ route('backend.posts.uploadimage', $post->id) }}");
ajax.send(formdata);
}
function progressHandler(event)
{
var percent = (event.loaded / event.total) * 100;
document.getElementById("progressPercent").style.width = Math.round(percent);
}
function completeHandler(event)
{
document.getElementById("status").innerHTML = event.target.responseText;
document.getElementById("progressPercent").style.width = 0;
}
function errorHandler(event)
{
document.getElementById("status").innerHTML = "Upload Failed";
}
function abortHandler(event)
{
document.getElementById("status").innerHTML = "Upload Aborted";
}
我的 PostController 中上传图片的方法是这样的:
public function uploadImage(Requests\UploadImageRequest $request, $id)
{
$post = $this->posts->findOrFail($id);
$image = $request->file('image');
$imageName = $image->getPathName();
$newImageName = $post->id . '-' . md5(microtime());
$imageExtension = $image->getClientOriginalExtension();
$imageFile = $newImageName . '.' . $imageExtension;
$path = public_path();
move_uploaded_file($imageName, $path . '/images/img_upload/' . $imageFile);
$post->where('id', $id)->update(['image_name' => $newImageName, 'ext' => $imageExtension]);
return view('backend.posts.uploadimage');
}
如何使用纯 javascript 从隐藏字段中 post 标记,或者是否有任何其他解决方案来解决此问题?请帮忙。
使用getElementsByName()
获取输入字段的值。
var _token = document.getElementsByName('_token')[0].value;
//and append the value to form data
formdata.append("_token", _token);
我正在尝试在图片上传中集成进度条。当我使用 PHP 提交表单时,我的代码工作正常,但是当我将 javascript 包含在进度条中时,我收到错误 "TokenMismatchException in VerifyCsrfToken.php line 67"。这是我的表格:
{!! Form::open(array('files' => true, 'class' => 'form', 'route' => ['backend.posts.uploadimage', $post->id])) !!}
<div class="form-group">
{!! Form::file('image', ['id' => 'image']) !!}
</div>
<hr>
<input type="button" value="Upload Image" class="btn btn-info btn-sm" onclick="uploadImage()">
{!! Form::close() !!}
此表单使用令牌生成隐藏输入字段:
<input name="_token" type="hidden" value="jGQWC2GljiSeZrL8wvfMaH490xHOh727345U6HzK">
我的 javascript 代码是这样的:
function uploadImage()
{
var file = document.getElementById("image").files[0];
var id = {{ $post->id }};
var formdata = new FormData();
formdata.append("image", file);
var ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress", progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("post", "{{ route('backend.posts.uploadimage', $post->id) }}");
ajax.send(formdata);
}
function progressHandler(event)
{
var percent = (event.loaded / event.total) * 100;
document.getElementById("progressPercent").style.width = Math.round(percent);
}
function completeHandler(event)
{
document.getElementById("status").innerHTML = event.target.responseText;
document.getElementById("progressPercent").style.width = 0;
}
function errorHandler(event)
{
document.getElementById("status").innerHTML = "Upload Failed";
}
function abortHandler(event)
{
document.getElementById("status").innerHTML = "Upload Aborted";
}
我的 PostController 中上传图片的方法是这样的:
public function uploadImage(Requests\UploadImageRequest $request, $id)
{
$post = $this->posts->findOrFail($id);
$image = $request->file('image');
$imageName = $image->getPathName();
$newImageName = $post->id . '-' . md5(microtime());
$imageExtension = $image->getClientOriginalExtension();
$imageFile = $newImageName . '.' . $imageExtension;
$path = public_path();
move_uploaded_file($imageName, $path . '/images/img_upload/' . $imageFile);
$post->where('id', $id)->update(['image_name' => $newImageName, 'ext' => $imageExtension]);
return view('backend.posts.uploadimage');
}
如何使用纯 javascript 从隐藏字段中 post 标记,或者是否有任何其他解决方案来解决此问题?请帮忙。
使用getElementsByName()
获取输入字段的值。
var _token = document.getElementsByName('_token')[0].value;
//and append the value to form data
formdata.append("_token", _token);