异步上传多个文件而不互相踩踏?

时间:2013-11-22 23:23:48

标签: javascript html5 google-app-engine extjs xmlhttprequest

这是我的代码,我使用此代码上传文件,但几乎每次都有2个或更多文件由于相同类型的错误而无法成功:

http://localhost:8080/_ah/upload/ag9mdW5ueS1wYWdlcy1ocmRyIgsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxiAgICAgICKCgw 
404 (No upload session: ag9mdW5ueS1wYWdlcy1ocmRyIgsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxiAgICAgICKCgw) 

现在我需要为每个文件获取不同的上传URL。 getUploadURL()为每次通话返回完全相同的网址。

缓存清除也无济于事。

我尝试使用Ext.TaskManager并且没有使用相同的结果,上面发布的错误发布在我用来测试的10个文件中的至少2个上。

var files = Ext.getDom('select-upload-button-fileInputEl').files;

function uploadFile(url, f) {
    var fd = new FormData();
    fd.append('file', f, f.name);
    var xhr = new XMLHttpRequest();
    xhr.upload.addEventListener('progress', function (e) {
        console.log(f.name + " : " + (e.loaded / e.total) * 100 + "%");
    });
    xhr.upload.addEventListener('load', function (e) {
        console.log(f.name + ' Transfer Complete');
    });
    xhr.open('POST', url, true);
    xhr.send(fd);
}

function getUploadURL(f) {
    var xhr = new XMLHttpRequest();
    xhr.addEventListener('load', function () {
        var url = this.responseText;
        console.log(url);
        var task = Ext.TaskManager.start({
            run: uploadFile(url, f)
        });
    });
    xhr.open('GET', '/upload', true);
    xhr.send()
}


Ext.each(files, function (f) {
    var task = Ext.TaskManager.start({
        run: getUploadURL(f)
    });
});

如果我更改代码以执行xhr.open('GET', '/upload', false);xhr.open('POST', url, false);,它会按预期工作,但如果可能,我宁愿让它异步。

只接受HTML5解决方案。

1 个答案:

答案 0 :(得分:0)

我能够使用以下行:

xhr.open('POST', url, false);

而不是

xhr.open('POST', url, true);

我真的很想拥有一个异步解决方案,但是现在我只需要让它工作。