Сохранить бинарный объект в GridFS на сервере - PullRequest
0 голосов
/ 15 января 2019

Обычно я создаю двоичный объект XLSX, загружая данные из MongoDb. Это тогда передано клиенту в ответе http. Это код, который я использую, который отлично работает.

Код серверной стороны:

//Row data (rows) generated from database
 conf.rows = rows;

 //Only creates Headers from columns in existing data
 const data = lib.objectToSheet(conf);

 //Create sheet & workbook
 const ws = XLSX.utils.aoa_to_sheet(data, {cellDates: true});
 const wb = {SheetNames: ["MBS"], Sheets: {MBS: ws}};
 const wopts = {bookType: 'xlsx', bookSST: false, type: 'binary', compression:true};

 //Create binary data to write to client
 const wbout = XLSX.write(wb, wopts);
 const fileName = 'FileName.xlsx';

 //write workbook to client
 request.response.ContentType = "application/file";
 request.response.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8');
 request.response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
 request.response.end(wbout, 'binary');

Вместо того, чтобы передавать это обратно клиенту, я хочу сохранить двоичный объект (wbout) в виде файла в MongoDb GridFS, чтобы этот файл мог быть загружен клиенту на более позднем этапе.

Я планирую сделать следующее

  1. создать файл в памяти на сервере. let f = новый FS.File (wbout);
  2. добавить свойства (имя, размер, данные, тип)
  3. сохранить файл в монго, используя коллекцию монго

пример на стороне клиента, где файл загружается из элемента управления вводом, я могу получить доступ к той же коллекции монго на сервере для вставки файла.

 FS.Utility.eachFile(evt, function (file) {
    TempDocuments.insert(file, function (err, fileObject) {
    if (err) {
            console.log('Error: ', err);
        }
    });
 });

Как мне создать файл из двоичного объекта и сохранить его непосредственно в GridFS?

Нужно ли сначала создавать файл для файловой системы во временную папку или я могу передать его непосредственно в gridFS?

1 Ответ

0 голосов
/ 15 января 2019

Благодаря посту Агнивы здесь (https://agniva.me/meteor/2016/04/25/meteor-arraybuffer.html) вы можете сделать следующее:

 let buffer = new Buffer(wbout, "binary");
 let file = new FS.File();
 file.name(fileName);
 file.extension('xlsx');
 file.attachData(buffer, {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8'});

 if(file){
     //save wbout in gridfs
     TempDocuments.insert(file, function (err, fileObject) {
         console.log(err, fileObject);
     })
 } else {
    console.log('nofile');
 }

Единственный минус в том, что файл создает случайное имя. Не уверен, что это может быть указано где-либо.

Редактировать: Свойства файла могут быть установлены как в примере выше источника: https://github.com/CollectionFS/Meteor-CollectionFS/wiki/FS.File

...