使用plupload将多个文件上载到Amazon S3

时间:2014-03-14 12:47:18

标签: file-upload amazon-s3 plupload

我使用plupload将图像上传到Amazon S3。 我在服务器上有一个生成我的签名和策略的方法,我通过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);
});

我需要的是能够在getAmazonUploadPolicty方法的回调中以编程方式触发特定文件的上传。

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:2)

找到解决方案。

我创造了一种方法 获取多个文件的策略 - 与用户选择的数量一样多

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:由于某些未知原因,有时上传多个文件时我会得到"无效签名"来自亚马逊,但第二次尝试它工作正常。 有什么想法吗?

答案 1 :(得分:0)

听起来很棘手....我认为你最好不要将uploader.start扔进FileFiltered命令,尽管在你的亚马逊回调中你肯定会得到回复,你可以验证它是什么你是在您尝试开始上传之前。

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中的任何内容允许你只上传一个特定的文件(虽然它肯定会很好),因为上传时间全部都是作为队列管理的。从理论上讲,你可以为每个文件创建一个新的队列吗?似乎有点奇怪,没有任何暴露开始上传特定文件