File upload 使用plupload将多个文件上载到AmazonS3

File upload 使用plupload将多个文件上载到AmazonS3,file-upload,amazon-s3,plupload,File Upload,Amazon S3,Plupload,我正在使用plupload将图像上传到AmazonS3。 我在服务器上有一个生成签名和策略的方法,我通过Http GET调用它 这对于一次上传一个文件来说效果很好 问题是当我选择多个文件进行上传时。 在每次文件上传之前,我需要调用我的服务器方法GetPolicy,但问题是上传有时会在我从GetPolicy得到响应之前开始。 下面是一些代码: uploader.bind("FileFiltered", function (up, file) { getAmazonUploadPolicty

我正在使用plupload将图像上传到AmazonS3。 我在服务器上有一个生成签名和策略的方法,我通过Http GET调用它

这对于一次上传一个文件来说效果很好

问题是当我选择多个文件进行上传时。 在每次文件上传之前,我需要调用我的服务器方法GetPolicy,但问题是上传有时会在我从GetPolicy得到响应之前开始。 下面是一些代码:

uploader.bind("FileFiltered", function (up, file) {
    getAmazonUploadPolicty(function (response) {
        uploader.settings.multipart_params.key = "test/" + response.FileId;
        uploader.settings.multipart_params.policy = response.policy;
        uploader.settings.multipart_params.signature = response.Signature;
        uploader.settings.multipart_params.Filename = response.FileId;
    });
});

uploader.bind("FilesAdded", function (up, files) {
    setTimeout(function () {
        uploader.start();
    }, 200);
});
我需要的是能够在getamazonploadpolicty方法的回调中以编程方式触发特定文件的上传

有什么想法吗?
谢谢

听起来很棘手。。。。我认为您最好将uploader.start添加到FileFiltered命令中,不过在您的amazon回调中,这样您就可以确保收到回复,并且在您尝试开始上载之前,您可以验证它是您想要的

uploader.bind("FileFiltered", function (up, file) {
    getAmazonUploadPolicty(function (response) {
        uploader.settings.multipart_params.key = "test/" + response.FileId;
        uploader.settings.multipart_params.policy = response.policy;
        uploader.settings.multipart_params.signature = response.Signature;
        uploader.settings.multipart_params.Filename = response.FileId;
        uploader.start();
    });
});
这仍然不能解决多文件问题。我不知道plupload中有什么东西允许你只上传一个特定的文件(尽管这确实很好),因为上传时都是作为一个队列来管理的。理论上,您可以为每个文件创建一个新队列?似乎有点奇怪,没有什么公开的东西可以开始上传特定的文件

找到了解决方案

我已经创建了一个方法 获取多个文件的策略-用户选择的数量

getAmazonUploadPolicyItems(count, callback); 
服务器方法返回策略列表

然后我就这么做了

var pocilites = { };

uploader.bind("BeforeUpload", function (up, file) {
    // this fires before each file upload

    var response = policies[file.id];
    uploader.settings.multipart_params.key = response.key;
    uploader.settings.multipart_params.policy = response.policy;
    uploader.settings.multipart_params.signature = response.signature;
    uploader.settings.multipart_params.Filename = response.filename;        
});

uploader.bind("FilesAdded", function (up, files) {
    getAmazonUploadPolicyItems(files.length, function (response) {

        $.each(files, function(i, file) {
            policies[file.id] = {
                key: response[i].Key,
                policy: response[i].Policy,
                signature: response[i].Signature,
                filename: response[i].Filename 
            };
        });

        uploader.start();
    });
});
希望这有助于其他人

PS:由于一些未知的原因,有时上传几个文件时,我会从Amazon获得“无效签名”,但第二次尝试时,效果很好。 有什么想法吗