Хранение файлов

Все файлы в системе хранятся в базе данных MongoDb через GridFs. Почему выбрано такое решение:

  1. Любое получение и изменение файлов происходит через обращение к базе посредством вызова серверного API, что позволяет настроить систему прав

  2. Упрощение механизмов резервного копирования

  3. Унификация компонентов использующих файлы

Настройки модуля прописываются в основном конфигурационном файле в разделе 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) // сохранение файла из базы на диск

На стороне клиента доступны следующие

  1. Шаблон редактирования file - подробнее об использовании шаблонов в редактировании моделей смотрите в разделе формы редактирования

  2. Шаблон редактирования form_image - для добавления картинок

  3. Custom binding user_avatar

  4. Custom binding FileUpload

  5. Метод сохранение файлов 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 добавленного файла.

Last updated