Я пытаюсь использовать плагин blueimp / jQuery-File-Upload для хранения изображений на сервере с помощью обработчика загрузки PHP. Я слежу за этими сообщениями, чтобы заставить его работать:
Форма загрузки файла, которую я использую, имеет несколько динамически добавленных полей ввода файла. Например, после добавления 3 полей:
<form id="entry_form" class="entry-form" role="form"> <div class="entry"> ... <input type="file" class="file-upload" name="files0[]" multiple> ... </div> <div class="entry"> ... <input type="file" class="file-upload" name="files1[]" multiple> ... </div> <div class="entry"> ... <input type="file" class="file-upload" name="files2[]" multiple> ... </div> </form> <div class="col-xs-6 col-sm-4"> <button id="save_btn" class="btn btn-lg btn-block">Save</button> </div>
Я могу успешно загружать файлы из этих полей, используя следующий JS-код:
var imageUpload = { init: function (selector, context, options) { selector = selector || '.file-upload'; context = context || $('.entry'); var filesList = []; var url = site_url + '/doUpload'; $(selector).fileupload(options || { url: url, type: 'POST', dataType: 'json', autoUpload: false, singleFileUploads: false, formData: {}, add: function (e, data) { for (var i = 0; i < data.files.length; i++) { filesList.push(data.files[i]); } return false; } }).on('change', function () { $(this).fileupload('add', { fileInput: $(selector) }); }); $('#save_btn').click(function (e) { e.preventDefault(); $(selector).fileupload('send', {files: filesList}); }); } };
Как вы можете видеть в обратном вызове события «add:» и методе «send» ближе к концу, я отправляю все файлы в один POST на сервер, это назначенная функциональность. Моя проблема в том, что переменная стороне сервера $ _FILES достигает сервера следующим образом:
$_FILES array[1] [files0] array[1] [name] array[1] [0] string "Collapse.png" [1] string "Expand.png" [2] string "Map.jpg"
Таким образом, я не могу связать, какое изображение было добавлено к входу. Итак, что мне нужно, чтобы добраться до сервера, это примерно так:
$_FILES array[3] [files0] array[1] [name] array[1] [0] string "Collapse.png" [files1] array[1] [name] array[1] [0] string "Expand.png" [files2] array[1] [name] array[1] [0] string "Map.jpg"
Я искал решение этого на некоторое время и не достиг желаемого результата. Не могли бы вы мне помочь?
Благодаря!
Кажется, вам нужно вручную добавить ключи массива,
Что-то вроде …
add: function (e, data) { for (var i = 0; i < data.files.length; i++) { filesList['files'+ i].push(data.files[i]); }
Решено после прочтения этого сообщения: Загрузка нескольких файлов асинхронно by blueimp jquery-fileupload
Все, что нужно было, это сохранить имя входного поля в переменную paramNames, чтобы отправить ее вместе с переменной «filesList».
Обновленный рабочий код:
var imageUpload = { init: function (selector, context, options) { selector = selector || '.file-upload'; context = context || $('.entry_form'); var filesList = [], paramNames = []; var url = site_url + '/doUpload'; $(selector, context).fileupload(options || { url: url, type: 'POST', dataType: 'json', autoUpload: false, singleFileUploads: false, add: function (e, data) { for (var i = 0; i < data.files.length; i++) { filesList.push(data.files[i]); paramNames.push(e.delegatedEvent.target.name); } return false; }, change: function (e, data) { }, done: function (e, data) { } }); $('#save_btn').click(function (e) { e.preventDefault(); $(selector, context).fileupload('send', {files:filesList, paramName: paramNames}); }); } };