Ajax调用半工作...文件已上传,但javascript未执行

时间:2015-05-04 09:36:12

标签: javascript ajax file upload callback

我很抱歉这个问题,但我有一个持久的错误,我根本不明白发生了什么......

我有一个工作正常的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

2 个答案:

答案 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:...而失败...

但是,如果有人有更好的主意=)