Как заставить плагин загрузки файлов JQuery вызывать бэкэнд только один раз для всех файлов в загрузке?

Я использую паруса.js для создания веб-сайта. У меня есть модель с именем timeline. В нем есть несколько текстовых полей, а также коллекция с именем pictures. Каждый timeline может иметь несколько pictures. Я хочу обновить все эти поля одновременно, когда пользователь нажимает save. Я использую загрузчик файлов JQuery, чтобы помочь загружать несколько файлов.

Проблема в том, что загрузка файла JQuery вызывает мою серверную службу загрузки файлов один раз для каждого загруженного изображения. Мне нужно обновить другие текстовые поля только один раз, и они должны быть обновлены до создания записей pictures, поскольку каждое изображение должно иметь связанный с ним идентификатор timeline.

Асинхронные задачи — это путь? Я так не думаю, поскольку загрузчик файлов JQuery несколько раз вызывает мой бэкэнд, я не думаю, что смогу выполнять задачи и обновлять другие поля, используя асинхронный параллелизм. Я мог бы сделать это, если бы это был единственный звонок для загрузки.

Я думаю оставить две кнопки отправки - одну для текстовых полей и одну для загрузки файлов, но на самом деле не предпочитаю этот путь. Было бы здорово, если бы кто-нибудь направлял меня в этом.




Ответы (3)


Если я правильно понимаю ваш вопрос, я думаю, вам нужно проверить файл jquery.fileupload.js в строке 112, попробуйте изменить singleFileUploads: false,

person mo.dhouibi    schedule 12.08.2015
comment
Спасибо @mo.dhouibi. Я пробую ваше решение. Загрузка файла JQuery требует, чтобы мы отправили ему определенные параметры после загрузки, такие как размер, URL, thumbnailUrl, deleteUrl из серверной службы загрузки файлов. Так что теперь, если я установлю singleFileUploads : false, эти параметры нужно изменить на массивы? - person A.R.K.S; 12.08.2015
comment
Извините, но я не уверен на 100% в том, как вы это делаете, но предполагая, что вы хотите загрузить пакет файлов и вставить строки в свою базу данных, это может не ответить на ваш вопрос, но это может вам помочь: - person mo.dhouibi; 12.08.2015

var counter = 0;
var allFilesObj = Array();

req.file('файлы[]') .upload({

            saveAs: function (__newFileStream, cb) { 
                var fileObj = {};

                var extension = __newFileStream.filename.split('.').pop();
                var original_name = __newFileStream.filename;


                fileObj.original_name = original_name;
                fileObj.name = "Thename";
                fileObj.ext = extension;
                fileObj.path = uploadpath+"The name"+ "." + extension;
                counter++;
                allFilesObj.push(fileObj);
                cb(null, uploadpath+"The name"+ "." + extension;);
            }
        }, function whenDone(err, uploadedFiles) {
            if (err) {
                console.log("ERROR");
                console.log(err);
                return res.negotiate(err);

            }

            else {

                    async.each(allFilesObj, function (row, done) {
                        var index = allFilesObj.indexOf(row);
                        row.col1 = req.param('col1');
                        row.col2 = req.param('col2');
                       row.col3 = req.param('col3');

                        done();
                    }, function (err) {

                        if (err) {
                            res.send("Error 500 , complete object array Defunct");

                        }



                        //DATABASE INSERT

                        YourModel.create(allFilesObj, function batchFileCreated(err, user) {

                            if (err) {
                                return res.send(err);
                            }
                            console.log("done");

// req.session.messages['success'][0] = "Файлы успешно загружены"; // вернуть res.redirect(req.get('referer'),{files: uploadedFiles,textParams: req.params.all()}); return res.ok({ файлы: uploadedFiles, textParams: req.params.all() }); });

                    });



                } 
            }

        });
person mo.dhouibi    schedule 12.08.2015
comment
Я столкнулся с другой проблемой. Если для параметра SingleFileUploads установлено значение false, несколько файлов, выбранных одновременно, загружаются в одном запросе, но вместо одновременного выбора нескольких файлов, если я добавляю много файлов с помощью отдельных кликов по добавлению файлов, он по-прежнему отправляет их по одному файлу за раз. Я проверил, нужно ли для этого устанавливать какие-либо другие флаги, но, похоже, их нет. Есть идеи? - person A.R.K.S; 13.08.2015
comment
добавление многих файлов с отдельными кликами по добавлению файла. Я предполагаю, что это ошибка с jquery-upload-file, по моему опыту, отдельный клик по добавлению учитывает только последнюю партию... может быть, кто-то может подтвердить это, и если это так , вам нужно найти способ во внешнем интерфейсе, чтобы пользователь не щелкал дважды. - person mo.dhouibi; 13.08.2015

Установка SingleFileUploads в false не очень помогла с загрузчиком файлов JQuery, поскольку, похоже, есть ошибка, как обсуждалось выше. Поэтому я вернул эту вещь к истине.

Я разделил входные данные на две отдельные формы: одну для ввода текстовых полей и одну для файлов (которая проходит через загрузчик файлов JQuery). Для формы текстовых полей я сохранил видимую кнопку, которую может нажать пользователь. Для другого я спрятал кнопку. Поэтому, как только пользователь нажимает видимую кнопку, я отправляю только ввод текста и создаю запись базы данных в бэкэнде (это делается с помощью вызова AJAX), а в поле success вызова AJAX я .click() скрытую кнопку, если число файлов больше 0.

person A.R.K.S    schedule 16.08.2015