将数据传递给 Jquery Ajax 的正确方法
Correct way to pass data to Jquery Ajax
使用 jquery 将数据传递给 ajax 的正确方法是什么?我有以下方法,我想从元标记传递 CSRF 令牌,但它不起作用。
<meta name="csrf-token" content="{{ csrf_token() }}">
<div class="fallback">
<input type="file" name="logo" id="logo" class="inputfile"/>
</div>
$(document).on("change", ".fallback .inputfile", function() {
$.ajax({
url: "/upload",
type: 'POST',
cache: false,
data: {
_token: $('meta[name="csrf-token"]').attr('content')
},
files: $(":file", this),
iframe: true,
processData: false
}).complete(function(data) {
console.log(data);
// $('#img-thumb').attr('src', data.path);
// $('input[name="job_logo"]').val(data.path);
});
});
Laravel处理文件的方法:
public function upload(Request $request) {
if($request->hasFile('logo')) {
//upload an image to the /img/tmp directory and return the filepath.
$file = $request->file('logo');
$tmpFileName = time() . '-' . $file->getClientOriginalName();
$tmpFilePath = '/img/tmp/';
$file = $file->move(public_path() . $tmpFilePath, $tmpFileName);
$path = $tmpFilePath . $tmpFileName;
return response()->json(['path'=> $path], 200);
} else {
return response()->json(false, 200);
}
}
我遵循了以下来源的文档 https://cmlenz.github.io/jquery-iframe-transport/
我收到令牌不匹配错误。请注意,这是使用Laravel 5.1
*更新*
应该能够将令牌直接添加到数据属性,因为 csrf 令牌已经在我的元标记中。下面是一个在rails上使用backbone.js/ruby完成的示例,但我不是backbone/rails的专家,所以如果有人可以将其转换为jquery,那将是有帮助的。(http://estebanpastorino.com/2013/09/27/simple-file-uploads-with-backbone-dot-js/)
uploadFile: function(event) {
var values = {};
var csrf_param = $('meta[name=csrf-param]').attr('content');
var csrf_token = $('meta[name=csrf-token]').attr('content');
var values_with_csrf;
if(event){ event.preventDefault(); }
_.each(this.$('form').serializeArray(), function(input){
values[ input.name ] = input.value;
})
values_with_csrf = _.extend({}, values)
values_with_csrf[csrf_param] = csrf_token
this.model.save(values, { iframe: true,
files: this.$('form :file'),
data: values_with_csrf });
}
processData: false
您已经告诉 jQuery 不要将包含您的数据的对象转换为适合通过 HTTP 传输的格式。
您需要将其添加到您的页面:
$(function() {
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN' : '{{ csrf_token() }}' } });
});
这是因为每次向服务器发送 AJAX 请求时,AJAX 都需要X-CSRF-TOKEN
(除非您将其关闭,我不建议这样做)。
资料来源:我自己与Laravel
的经历。
相关文章:
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- AJAX不会在文件上传后重定向到网页-POST方法
- 错误405:向Java控制器(Ajax)发送JSON时找不到POST方法
- 通过ajax从客户端调用C#方法来执行C#方法
- 使用Ajax的问题's发送多个值的Post方法
- 使用javascript ajax post方法的未定义偏移PHP错误
- 如何在ajax中调用javascript对象的方法
- 如何使用get或post方法连接和执行ajax
- Jquery ajax方法请求体为null,但poster工作正常
- jQuery/Ajax-试图通过Ajax创建POST方法并获得对HTML的响应
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 如何使用发布方法 (AJAX) 调用异常
- 跨域 Post 方法 ajax 调用使用 jQuery 和 XML 响应
- 405:不允许使用方法(AJAX 查询到 Flask)
- 我的排序方法(AJAX,PHP&MySQL)出了什么问题
- 调用母版页“;CS”;方法(ajax不起作用)
- 将JSON对象发布到web方法$.ajax
- POST到Javascript中的类方法(Ajax ->PHP)
- 未捕获类型错误:不能调用方法'ajax'的定义
- 正确添加类的方法AJAX调用