Асинхронная загрузка нескольких файлов с помощью blueimp jquery-fileupload
Я использую библиотеку загрузки файлов jQuery (http://github.com/blueimp/jQuery-File-Upload), и я застрял, выясняя, как использовать библиотеку, удовлетворяющую следующим условиям.
- страница имеет несколько полей ввода файлов, окруженных тегом формы.
- пользователи могут прикреплять несколько файлов к каждому полю ввода
- все файлы отправляются на сервер при нажатии кнопки, а не при подключении файлов к входу поля.
- загрузка осуществляется асинхронно
- скажем, на странице есть 3 поля ввода с атрибутами имен " file1 []", "file2 []" и " file3 []", полезная нагрузка запроса должна быть похожа на {file1: [ массив файлов на file1 []], file2: [ массив файлов на file2 []],...}
вот jsFiddle, он ведет себя странно до сих пор, что он отправляет запрос post дважды, и первый отменяется.
обновления
Теперь благодаря @Cbroe's комментарий, проблема, что запрос отправляется дважды, исправлена. Однако параметр keys of request установлен неправильно. Вот обновленный jsFiddle.
основная часть кода js выглядит следующим образом.
$(document).ready(function(){
var filesList = []
var elem = $("form")
file_upload = elem.fileupload({
formData:{extra:1},
autoUpload: false,
fileInput: $("input:file"),
}).on("fileuploadadd", function(e, data){
filesList.push(data.files[0])
});
$("button").click(function(){
file_upload.fileupload('send', {files:filesList} )
})
})
кто-нибудь знает, как заставить это работать?
3 ответов
решена.
Скрипка: http://jsfiddle.net/BAQtG/29/
и код js
$(document).ready(function(){
var filesList = [],
paramNames = [],
elem = $("form");
file_upload = elem.fileupload({
formData:{extra:1},
autoUpload: false,
fileInput: $("input:file"),
}).on("fileuploadadd", function(e, data){
filesList.push(data.files[0]);
paramNames.push(e.delegatedEvent.target.name);
});
$("button").click(function(e){
e.preventDefault();
file_upload.fileupload('send', {files:filesList, paramName: paramNames});
})
})
первый запрос POST, инициированный вашим скриптом, отменяется, потому что кнопка передает форма (вызывающая второй запрос POST).
использовать type="button"
на button
Если вы не хочу представить функциональность.
вы должны добавить return false;
, как показано ниже:
$("button").click(function(){
file_upload.fileupload('send', {files:filesList} )
return false;
})
или указать :
<button type="button">send by fileupload send api</button>
для того, чтобы установить formData
использовать следующий:
$("button").click(function () {
file_upload.fileupload('send', {
files: filesList,
formData: {
json: JSON.encode({
extra: 1
})
}
})
})
специально для JSFiddle, если вы хотите получить extra
значение в ответе, вы должны закодировать его и назначить его свойству с именем json
.
здесь ' s рабочий пример.