Загрузите несколько файлов в 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.

Любые идеи? Спасибо


person Mihai    schedule 14.03.2014    source источник


Ответы (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();
    });
});

Надеюсь, это поможет кому-то esle.

PS: По неизвестной причине иногда при загрузке нескольких файлов я получаю "неверную подпись" от Amazon, но со второй попытки все работает нормально. Любые идеи?

person Mihai    schedule 16.03.2014

Звучит сложно .... Я думаю, вам было бы лучше добавить 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, которое позволяет вам просто загружать определенный файл (хотя это было бы неплохо), поскольку все загрузки управляются как очередь, когда приходит время загрузки. Теоретически, может быть, вы могли бы что-нибудь сделать, чтобы создать новую очередь для каждого файла? кажется странным, нет ничего, что могло бы начать загрузку определенного файла

person Joe Meyer    schedule 14.03.2014