【问题标题】:Using multer with inmemory option and streaming into mongodb gridfs使用带有 inmemory 选项的 multer 并流式传输到 mongodb gridfs
【发布时间】:2015-03-11 04:42:57
【问题描述】:

以下代码按预期工作:它读取已使用 multer [https://github.com/expressjs/multer] 上传的文件并将其流式传输到 gridfs。我也可以从 gridfs 中蒸出这个。

var target = gfs.createWriteStream({
            filename: fileItem.originalname,
            mode: 'w',
            metadata: metaData
        });

        fs.createReadStream(tempFile)
            .on('end', function () {
                console.log('File read and stored');
            })
            .on('error', function (err) {
                console.log('Error handling file ' + err);
            })
            .pipe(target);

        // Attach new file to document list
        target.on('close', function (file) {
            filesUploadedList.push(file._id);

fileItem 是通过迭代上传的文件req.files.file 获得的。

但是,我正在尝试找出 multer 的 inMemory 选项。如果我将此设置为 true,则 fileItem 将填充缓冲区。请注意,如果没有这个选项,fileItem 的缓冲区/内容是空的,这就是为什么在上面的代码中它从fileItem.location 读取的原因。

用内容填充目标的最佳方法是什么? fs.createReadStream 正在做管道。

谢谢。

J

【问题讨论】:

标签: node.js mongodb gridfs


【解决方案1】:

您可以使用streamifier 完成此操作。代码看起来应该是这样的:

streamifier.createReadStream(fileItem.buffer).pipe(target);

Multer 不会向磁盘写入任何内容,目标现在填充了正在上传的文件的缓冲区/内容。

【讨论】:

  • var stream = streamifier.createReadStream(fileItem.buffer);然后将流用于任何事情。
【解决方案2】:

你可以这样使用它:

(此处原意:stored files directly in mongodb with gridfs-stream

app.post('/upload',multer({
    dest:"./tmp/",
    upload:null,// take uploading process 
    inMemory:true, //or false, not needed here

    onFileUploadStart:function(file){
       //set upload with WritableStream        
       this.upload = gfs.createWriteStream({
           filename:file.originalname,
           mode:"w",
           chunkSize:1024*4,
           content_type:file.mimetype,
           root:"fs",
           metadata: {} // put some crazy meta data in here
       });
    },

    onFileUploadData:function(file,data) {
       //put the chunks into db 
       this.upload.write(data);
    },

    onFileUploadComplete:function(file) {
       //end process 
       this.upload.end();
       console.log('successfully written File to MongoDB Gridfs');
    }
    }),
    function(req,res) {
       res.sendStatus(200);
   });

由于您使用的是 onFileUploadData() 函数,Gridsfs 将在数据到达时被填充。无论将 inMemory 设置为 true 还是 false,这都有效。 您应该注意,如果您正在处理大文件,file.buffer[] 可能会变得非常大。它只是所有传入数据片段的副本。

理论上,在busboy 之上使用自己定义的中间件可能会更好,根本不执行文件操作(如 Multer 中所用)。

【讨论】:

  • 这个不能再用multer完成了,它只接受两个参数,filename和dest
  • 其实可以使用StorageEngines
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2019-08-11
  • 2017-06-05
  • 2021-10-24
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多