0

通常我通过从 MongoDb 加载数据来创建 XLSX 二进制对象。然后通过 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. 在服务器的内存中创建一个文件。让 f = new FS.File(wbout);
  2. 添加属性(名称、大小、数据、类型)
  3. 使用 mongo 集合将文件保存到 mongo

从输入控件加载文件的客户端示例,我可以访问服务器上的相同 mongo 集合以插入文件。

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

如何从二进制对象创建文件并将其直接保存到 GridFS?

我是否需要先将文件系统的文件创建到临时位置,还是可以直接将其流式传输到 gridFS?

4

1 回答 1

1

感谢 Agniva 的帖子 ( 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

于 2019-01-15T12:41:57.597 回答