文件上传事件上下文和javascript

时间:2015-04-01 22:25:33

标签: javascript jquery ajax file-upload

我需要有条件地打开以下文件上传对话框:

<input type="file" id="Upload">

基于来自服务器的Ajax响应。输入元素是隐藏的,因为我不希望显示默认的丑陋文件文本框和按钮。所以我有另一个用户点击的元素来启动上传。

以下可以从用户启动事件上下文的脚本中正常工作。

$('#Upload').click();

但在Ajax调用的响应执行时失败。现在我知道这是设计用于Firefox和Chrome的安全问题,但在我的情况下,用户启动ajax调用,并且服务器需要决定服务器上的条件当前是否允许上传。如果是这样,我想打开文件上传对话框,否则我需要发布一条消息,说明x原因不允许该操作(由服务器返回)。

问题是Ajax回调不在用户脚本上下文中,因此不会执行.click()打开文件对话框(按设计)。

还可以采取哪些措施来解决这个问题?有没有办法捕获用户事件上下文并将其重用于Ajax调用的回调?

1 个答案:

答案 0 :(得分:0)

使用JQuery创建一个简单的上传器使用此代码

HTML

<form id="form" enctype="multipart/form-data">
    <input type="file" id="Upload"></br>
    <div class="progress">
        <div class="progress-bar progress-bar-info progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div>
    </div>
    <button type="submit">Start Upload</button>
</form>

您选择文件,并在单击“开始上传”按钮确认上传后

JQuery的

$('#form').submit(function(){
    var data = new FormData(this);
    $.ajax({
        type: "POST",
        url: URL_TO_UPLOADER,
        data: data,
        contentType: false,
        cache: false,
        processData:false,
        beforeSend: function() {
            $(".progress-bar").width('0%');
        },
        xhr: function() {
            var xhr = new window.XMLHttpRequest();

            // Upload progress
            xhr.upload.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                    var percentComplete = (evt.loaded / evt.total) * 100;
                    $(".progress-bar").width(percentComplete+'%');
                }
            }, false);

            // Download progress
            xhr.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total * 100;
                    $find(".progress-bar").width(percentComplete+'%');
                }
            }, false);
            return xhr;
        },
        success: function(data) {
            alert("Success");
            // File Uploaded
        },
        error: function(xhr, textStatus, errorThrown) {
            alert("Error");
        },
    });
});

PATH_TO_UPLOADER是接收该文件的网址。