Загрузка файлов происходит с помощью специального UI компонента Uploader.
Related sample: Basic List Uploader
Webix Uploader наследуется от view и выглядит как стандартная кнопка Webix.
Обычно работа с загрузчиком начинается по клику на кнопку, но диалог загрузки может быть вызван и любым другим событием на странице (не работает для IE8), а саму кнопку можно сделать невидимой.
Uploader инициализируется вместе с UI компонентом отображающим предзагруженные и загруженные файлы. Этот компонент (может быть списком, темплейтом и т.п.) называется телом загрузчика (uploader body) и инициализируется отдельно. Задайте ID для uploader body и укажите его в свойстве link загрузчика, чтобы объединить два компонента.
webix.ui({
view:"form",
rows:[
{
view:"uploader",
id: "uploader1",
value:"Upload file",
link:"mylist",
upload:"//docs.webix.com/samples/server/upload",
datatype:"json"
},
{
view:"list",
id:"list1",
type:"uploader",
autoheight:true,
borderless:true
}
]
});
Свойства Uploader:
true
. Если значение false
, Uploader позволит выбирать для загрузки только один файл, загруженный ранее файл будет удален и заменен новымtrue
. Если значение false
, Uploader не будет обрабатывать файлы в момент загрузки. Файлы добавятся в тело загрузчика, после чего их можно будет отправить на сервер, вызвав метод send()Подробнее о настройке и серверном скрипте в соответствующих статьях.
Для отображения свойств загруженных файлов, библиотека Webix предлагает компонент list. Вы можете переопределить настройки по умолчанию и установить любой другой компонент, указав соответствующий темплейт.
С установленным значением type:"uploader"
, список отобразит следующую информацию:
autosend:false
).Также вы можете создать свой тип для элементов списка.
Если вы хотите отобразить свойства файла в виде строки, задайте темплейт функцией.
В примере ниже темплейт отображает свойства файла строкой из имен файла, разделенных запятой.
view:"template",
template:function(data){
var names = [];
if (data.each)
data.each(function(obj){ names.push(obj.name); });
return names.join(", ");
}
Related sample: Template Uploader
Такой способ удобен для отображения вложений к сообщению.
Свойства загруженных файлов хранятся в Data Collection загрузчика которая содержит объект с объектами файла.
Чтобы получить все текущие файлы добавленные в тело загрузчика, используйте следующий код:
// "uploader1" - ID загрузчика
$$("upl1").files.data.pull;
Запись вернет объект с загруженными элементами данных (файлами). Каждый элемент файла содержит информацию о его размере, типе, статусе и т.п.
Каждый объект файла включает:
ID элементов - это случайные числа, которые могут быть получены с помощью методов getFirstId(), getLastId() и getNextId().
Объект файла может быть получен с помощью метода getItem с ID нужного элемента в качестве параметра:
var file_id = $$("uploader1").files.getFirstId(); // получает ID
var fileobj = $$("uploader1").files.getItem(file_id).file; // получает объект файла
filename = $$("uploader1").files.getItem(file_id).name; // получает свойства
// или
filename = fileobj.name;
Для работы с коллекцией файлов и каждым объектом файла, воспользуйтесь возможностями Webix API, например:
$$("uploader1").files.parse(); // разобрать данные JSON в коллекцию файлов
$$("uploader1").files.getFirstId(); // получить ID первого и последнего элемента коллекции
$$("uploader1").files.getLastId();
$$("uploader1").files.getNextId(id); // получить ID файла следующего за определенным
$$(this.config.uploader).files.remove(id); // удалить указанный файл
Обратите внимание что когда вы разбираете строку JSON на объекты файла, файлы на самом деле не добавляются в загрузчик!
$$("uploader1").files.parse([
{ name:"cover.jpg", sizetext:"54kb", status:"server" },
{ name:"page01.jpg", sizetext:"122kb", status:"server" },
{ name:"page02.jpg", sizetext:"142kb", status:"server" }
]);
Related sample: Adding Files by API
Вы можете упростить имена файлов с помощью метода getValues(). Метод применяется к форме содержащей загрузчик и возвращает свойство name каждого файла в строке через запятую.
webix.ui({
view:"form", rows: [
{ view: "uploader", name:"records"},
{ view:"button", click: function() {
var text = this.getParentView().getValues();
text = JSON.stringify(text, "\n");
webix.message("<pre>"+text+"</pre>");
}
}
]
});
Related sample: Template Uploader
Отмена загрузки сразу нескольких файлов:
function cancel(){
var id= $$("uploader1").files.getFirstId();
while(id){
$$("uploader1").stopUpload(id);
id = $$("uploader1").files.getNextId(id);
}
}
Метод each() перебирает все файловые объекты Uploader и предоставляет доступ ко всем их свойствам. Это также дает доступ к текущему файловому индексу в списке файлов (индексы отсчитываются от 0).
$$("uploader1").files.data.each(function(obj,index){
if (obj.status == "server")
// ваш код
});
Также может быть обработан массив файлов:
var order = $$("uploader1").files.data.order;
for (var i=0; i < order.length; i++){
if ($$("uploader1").files.getItem(order[i]).status = "server")
// ваш код
}
Здесь приведены основные события для работы с загрузчиком. Полный список событий вы найдете в справочнике API.
Подтверждение загрузки
$$("uploader1").attachEvent("onUploadComplete", function(){
webix.message("done");
});
Вы также можете использовать события коллекции данных файлов, которая хранит все загруженные в Uploader файлы. Например:
$$("uploader1").files.attachEvent("onAfterDelete", function(){
// ваш код
});
Полный список событий Data Collection вы найдете в справочнике API.