Файлы
Все файлы в системе хранятся в базе данных MongoDb через GridFs. Почему выбрано такое решение:
- Любое получение и изменение файлов происходит через обращение к базе посредством вызова серверного API, что позволяет настроить систему прав
- Упрощение механизмов резервного копирования
- Унификация компонентов использующих файлы
Настройки модуля прописываются в основном конфигурационном файле в разделе gridfs
, gridfs : {
host:'localhost',
dbname:'ugmk_files'
}
Рекомендуется использовать отдельную базу данных.
На серверной стороне реализация работы с файлами находится в src/gfs.js. Список используемых маршрутов:
post('/api/gfs', multer({ dest: os.tmpdir()}).single('file'),function (req, res, next){}) // добавление
get('/api/gfs/remove/:id', function (req, res, next) {}) // удаление
get('/api/gfs/download/:id', function (req, res, next) {}) // скачивание
get('/api/gfs/:id', function (req, res, next) {}) // получение контента файла
Кроме маршрутов, библиотека предоставляет несколько полезных методов для работы с файлами:
CopyFile = function (id, done) // копирование файла
ToDisk = function (id, dir, done) // сохранение файла из базы на диск
На стороне клиента доступны следующие
- Шаблон редактирования file - подробнее об использовании шаблонов в редактировании моделей смотрите в разделе формы редактирования
- Шаблон редактирования form_image - для добавления картинок
- Custom binding user_avatar
- Custom binding FileUpload
- Метод сохранение файлов MModels.SaveFileToGfs
Пример кода, используемого в модуле filemanager:
self.AddAttach = function(){
if (!self.NewAttach().File()){
return self.Error("Добавьте файл");
}
var File2Save = self.NewAttach().File();
if (typeof File2Save =='object'){
if (!self.NewAttach().NameFile()){
self.NewAttach().NameFile(File2Save.name);
}
}
MModels.SaveFileToGfs(File2Save,function(err,id){
if (err) return self.Error(err);
var File2Send = _.omit(self.NewAttach().toJS(),"File");
if (id) File2Send = _.merge(File2Send,{HashCode:id});
var Data2Send = {
File:File2Send,
Data:self.NewAttachData().toJS()
}
$.ajax({
url:self.base,
method:'post',
data:Data2Send,
success:function(data){
if (data.err) return self.Error(data.err);
self.LoadFiles(function(){
$('#attachDialog').modal('hide');
self.CleanNewAttach();
self.CountAttaches();
self.Init();
});
}
})
})
}
В данном примере перед тем как отправить форму на сохранение, предварительно на сервер отправляется файл. Если при добавлении файла не произошло ошибки, то вторым этапом отправляется форма, в теле которой передается id добавленного файла.