我们可以将 multer 配置为不在本地存储文件而仅使用 req.files.image.path 吗?

问题描述 投票:0回答:6

我的应用需求如下: 我将图像上传到 Cloudinary 并将图像的 url 存储在我的 mongodb 数据库中。

要将图像上传到cloudinary,我需要提供文件路径,为此,我使用multer。我使用以下语句:

app.use(multer({ dest: './uploads/'}));

我面临的问题是,每次我将图像从本地系统上传到 Cloudinary 上的数据库时,都会在“./uploads/”中创建本地副本。我希望这种情况不会发生,因为我的图像位于 Cloudinary 上.

我阅读了multer的文档,其中写道:

Multer 接受一个 options 对象,其中最基本的是 dest 属性,它告诉 Multer 将文件上传到哪里。如果省略选项对象,文件将被重命名并上传到系统的临时目录。

我无法确定该临时上传空间是否需要清理或是否已得到处理。我的图像已上传到 Cloudinary。我仅使用 multer 来获取:

req.files.photo.path

工作。有没有其他方法可以做到同样的事情,或者是否可以配置 multer 不将图像存储到我的本地系统?

node.js express npm multer
6个回答
12
投票

2018 年 7 月:

因此,如果您想将图像存储到某种数据库中,您可能需要将其转换为缓冲区,然后将缓冲区插入数据库中。如果您使用

multer
处理多部分表单(在本例中是要上传的图像文件),您可以使用
multer
memoryStorage
直接获取图像的缓冲区。换句话说:

var storage = multer.memoryStorage(); 
 var upload = multer({ storage: storage });

获取缓冲区

当使用内存存储时,文件信息将包含一个名为 buffer 的字段,其中包含整个文件。

这意味着您可以从命令中获取缓冲区,如

req.files[0].buffer


我更新了一个简单的存储库,演示如何将图像上传到数据库,而无需在此存储库中将图像复制到本地


3
投票

来自 Multer 信息页面: https://www.npmjs.com/package/multer

如果 inMemory 选项为 true - 不会写入任何数据 磁盘,但数据保存在文件对象可访问的缓冲区中。


3
投票

2016 年 7 月 14 日之前,您无法配置

multer
在本地存储文件。

但是multer只是busboy的包装。所以,如果我们想避免撞到磁盘,我们可以尝试直接使用

busboy

Connect-bubsboy 将帮助我们:

app.use(busboy());

// request handler
req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
  file.on('end', function() {
    // do stuff with req.files[fieldname]
  });
});

更新于2016年7月14日

现在 multer 有

MemoryStorage
将文件作为缓冲区存储在内存中。

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })

1
投票

文件上传到 Cloudinary 后,您还可以删除该文件。

// used to delete images from local directory
const fs = require('fs'); // gain access to file system
const util = require('util');
const deleteFile = util.promisify(fs.unlink); // unlink will delete the file

// in your post request
app.post('/images', upload.single('myFile'), async function(req, res) {
  const file = req.file; // multer gives access to the file object in the request
  // code to upload the file to Cloudinary
  await deleteFile(file.path); // remove locally stored image by passing the file's path  
});

0
投票

如果您不希望 Multer 在本地保存文件,您可以省略 diskStorage 方法中的目标选项,或者明确将其设置为

undefined
。 你不能将其设置为
null
,否则 Multer 会抛出错误

我的意思是;

import multer from 'multer';
// ... or const multer = require('multer'); for CJS

const storage = multer.diskStorage({
    destination: undefined, // or you just omit it
    filename: (req, file, cb) => {
            console.log({file})
            const fileName = file.originalname.split(' ').join('-');
            const extension = file.mimetype.split('/').pop();
            cb(null, `${fileName}-${Date.now()}.${extension}`);
        }
});

const uploadMiddleWare = multer({ storage: storage });

这对我的开发很有用,尚未在生产中尝试过,但我认为应该如此。


-1
投票

如果您使用 Cloudinary 存储图像,请尝试使用 multer-storage-cloudinary

© www.soinside.com 2019 - 2024. All rights reserved.