使用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/
的文档进行操作我得到了tokenmismatch错误。请注意,这是使用Laravel 5.1
*更新*
应该能够将令牌直接添加到数据属性,因为csrf令牌已经在我的元标记中。下面是在rails上使用backbone.js / ruby完成的示例,但我不是骨干/ 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 });
}
答案 0 :(得分:2)
processData: false
您告诉jQuery 不将包含您数据的对象转换为适合通过HTTP传输的格式。
答案 1 :(得分:1)
您需要将此添加到您的页面:
$(function() {
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN' : '{{ csrf_token() }}' } });
});
这是因为AJAX每次都需要X-CSRF-TOKEN
你向服务器发送一个AJAX请求(除非你把它关闭,我不推荐)。
消息来源:我自己使用Laravel
的经历。