我很抱歉这个问题,但我有一个持久的错误,我根本不明白发生了什么......
我有一个工作正常的ajax上传功能
function startUp(hash) {
$('#file_up_form').ajaxForm({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-CSRF-Token", '{{ Session::token() }}' );
xhr.setRequestHeader('Sha-Sha',hash);
//other stuff
},
uploadProgress: function(event, position, total, percentComplete) {
//some stuff
},
complete : function(xhr) {
//some stuff
},
error : function(xhr) {
//some stuff
}
});
}
当我这样称呼时:
$("#start_up_button").on('click', function() {
if(checkFile()){
startUp('f4274dd2284704f1158b2cecd71666a37ba5b949f97fc521974f98fa3dd0ea706cca7253244e20f2a4c4c694052097c45260edfe679c9e7b56896858a34839cd');
//getHash();
}
else{
$('#myModalerror').modal('show');
$("#myModalerror").css("z-index", "1500");
}
});
一切正常。 但是,当我取消注释第二行并评论第一行时,请将其命名为:
function getHash(){
input = document.getElementById('fileToUpload');
file = input.files[0];
var reader = new FileReader();
reader.onload = function(e) {
var shaObj = new jsSHA(reader.result,"BYTES");
var hash = shaObj.getHash("SHA-512", "HEX");
console.log(hash);
startUp(hash);
};
reader.readAsBinaryString(file);
}
对于ajax没有任何作用:console.log显示正确的哈希值,但没有设置头文件,并且“//某些东西”没有任何作品......但文件已上传!! (??)我试图用
包裹调用setTimeout(function() {
startUp(hash);
}, 200);
但Firefox刚崩溃。有什么想法??
THX
答案 0 :(得分:0)
ajaxForm()
中$('#file_up_form').ajaxForm({ ... })
的行为不来触发AJAX请求。
这是一个事件绑定功能。 (我没有通过API文档,但可能会将表单提交事件绑定到其内部库函数之一)
要实际触发AJAX请求,您必须在HTML <input type="submit" >
中添加<form>
按钮,然后点击它。 (图书馆将阻止传统的表单提交,并通过AJAX提交)
示例实施:
<强> JS:强>
<script type="text/javascript">
$(document).ready(function(){
$("#file_up_form").ajaxForm({ // bind library function to the form
beforeSend: function(xhr){
input = document.getElementById('fileToUpload');;
file = input.files[0];
if(file){
var reader = new FileReader();
reader.readAsBinaryString(file);
var shaObj = new jsSHA(reader.result,"BYTES");
var hash = shaObj.getHash("SHA-512", "HEX");
xhr.setRequestHeader('Sha-Sha', hash);
}else{
alert("First, please select a file to upload.");
return false;
}
},
uploadProgress: function(event, position, total, percentComplete){ },
success: function() { },
complete: function(response) { },
error: function() { }
});
});
</script>
<强> HTML:强>
<body>
<form id="file_up_form" action="upload.php" method="post">
<input type="file" id="fileToUpload" name="uploadedfile" />
<!-- Click on submit to perform AJAX call -->
<input type="submit" value="Upload">
</form>
</body>
答案 1 :(得分:-1)
THX,
但这不起作用,因为javascript不同步,我需要强制与pid
回调同步,然后调用ajax ... ajax请求将被发送,无论是如果哈希是否被计算,如果我在reader.onload()
内,它已经结束,即使.ajaxForm()
也是异步的,所以它对发送ajax请求没有影响...或者如果我放置它在另一个地方它只是崩溃firefox ...
我有一个上传按钮来触发请求,当然,这是我必须首先处理sha-512的计算然后使用表单绑定触发ajax的唯一触发器。
但我不明白的是:
为什么setTimeout(function(){...})
在"startUp('ARandomHash');"
和$("#start_up_button").on('click', function() {...});
内完美地工作,打印正确的哈希值,但是ajax是"hash=...; console.log(hash); startUp(hash);"
回调中的完全失败...事件是由相同的点击事件,它只有2个执行范围......
我认为我没有丢失这两个范围更多的提交事件,因为文件正确上传...只是reader.onload()
等未执行。
我认为我宁愿尝试使用哈希,它可能是一个字符编码问题,否则没有任何意义,它也会因beforeSend:..., uploadProgress:...
而失败...
但是,如果有人有更好的主意=)