Filepicker.io — остановить .pickMultiple от автоматического сохранения файла в корзине S3

Я пытаюсь использовать Filepicker.io в качестве загрузчика, но для запуска события onSuccess для каждого файла в полезной нагрузке я использую комбинацию методов .pickMultiple и .store. Вот так:

    filepicker.pickMultiple(function(fpfiles){

        for(var i = 0; i < fpfiles.length; i++){

            //Clean the filename

            //Check duplicate

            //Store the file on S3
            filepicker.store(
               fpfiles[i].url,
               {location: 'S3', path: 'filepicker/' + fpfiles[i].filename},
               function(my_uploaded_file){
                  //Do some other cool stuff ...
               }
            );
        }               
    });

(Это противоположно использованию метода .pickAndStore, который запускает событие onSuccess только после завершения передачи всей полезной нагрузки)

Проблема, с которой я столкнулся, заключается в том, что мне кажется, что метод .pickMultiple «автоматически» сохраняет копию файла в корне моей корзины S3; поэтому я получаю две копии одного и того же файла.

Например:

Если я загружу файл my_file.png в папку IMAGES в моей корзине, я должен получить результат http://s3.amazonaws.com/my_bucket/IMAGES/my_file.png

Что происходит, но я также получаю: http://s3.amazonaws.com/my_bucket/UNIQUE_ID_my_file.png

Кто-нибудь знает, как запретить .pickMultiple автоматически добавлять файл в мою корзину S3?

Спасибо за любую помощь.


person AJB    schedule 27.03.2013    source источник
comment
К сожалению, в текущем API любые локальные загрузки, вызываемые с помощью вызовов .pick() или .pickMultiple(), будут сохранять файлы в вашей корзине S3. Это связано с рядом устаревших клиентов, которые рассчитывают на такое поведение при загрузке в S3. Вызов .pickAndStore() был создан в значительной степени для решения этой проблемы. Я понимаю, что это не идеально, но при необходимости вы можете использовать вызов filepicker.remove() для очистки промежуточных файлов.   -  person brettcvz    schedule 27.03.2013
comment
Привет, Бретт. Где в моем коде я могу вызвать метод .remove? Я пытался реализовать это, и это нарушает все функции, кроме «дубликата» файла — того, который я пытаюсь удалить.   -  person AJB    schedule 28.03.2013
comment
В обратном вызове .store, но в исходном файле   -  person brettcvz    schedule 28.03.2013
comment
Привет, Бретт! В конце концов я работал с Лияном, чтобы сделать это, но это аннулировало первоначальную причину использования .pickMultiple —> .store (запуск события onSuccess для каждого файла в полезной нагрузке). Я сделал это сегодня, используя другой подход.   -  person AJB    schedule 29.03.2013


Ответы (1)


Для всех, кто может столкнуться с той же проблемой, метод .pickMultiple() —> .store() — это тупик. (Единственный) способ заставить событие onSuccess срабатывать для каждого файла в полезной нагрузке — это использовать ванильное событие <input type="file" /> onChange для получения массива FILES элемента, а затем выполнить цикл по FILES и вызвать .store() для каждого из файлов в массиве.

Пример:

$('#BTN_upload').change(function(){

    var files = $(this)[0].files;

    //So you can see what should be uploading
    console.log(JSON.stringify(files));

    //Loop the files array to store each file on S3
    for(var i = 0; i < files.length; i++){

        //All good. Now execute the .store call
        filepicker.store(

            //The file to upload
            files[i],

            //The file options
            //(I'm storing the files in a specific folder within my S3 bucket called 'my_folder')
            //This is also where you'll rename your file to whatever you'd like
            {path: 'my_folder/' + files[i].name},

            //OnSuccess
            function(FPFile){
                console.log("Store successful: ", JSON.stringify(FPFile));
                //Now possibly call .remove() to remove the 'temp' file from FP.io
            },

            //OnError
            function(FPError){
                console.log(FPError.toString());
            },

            //OnProgress
            function(progress){
                console.log("Loading: " + progress + "%");
            }
       );

    }

});
filepicker.setKey('MY_FP.IO_KEY');

И HTML:

<input id="BTN_upload" type="file" />

Этот пример не является готовым продуктом. Вам по-прежнему придется создавать свои собственные отзывы пользователей (например, отображение очереди с индикаторами выполнения), проверять дубликаты, переименовывать и т. д. Но это все довольно простые вещи.

ПРИМЕЧАНИЕ. Это относится только к загрузкам с локального сервера на S3. Я не уверен, как интегрировать другие источники, которые есть в FP.io. Может, да?

person AJB    schedule 29.03.2013