22

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

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

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

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

我阅读了multer 的文档,上面写着:

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

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

req.files.photo.path

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

4

5 回答 5

9

2018 年 7 月:

因此,如果要将图像存储到某种数据库中,您可能希望将其转换为缓冲区,然后将缓冲区插入数据库。如果你是multer用来处理multipart表单(这里是你要上传的图片文件),你可以使用multer'smemoryStorage直接获取图片的缓冲区。换句话说:

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

获取缓冲区

使用内存存储时,文件信息将包含一个名为缓冲区的字段,该字段包含整个文件。

这意味着您可以从命令中获取缓冲区,例如req.files[0].buffer


我更新了一个简单的 repo,演示了将图像上传到数据库,而不在这个 repo中复制到本地

于 2018-07-18T17:50:17.423 回答
3

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

如果inMemory选项为真 - 没有数据写入磁盘,但数据保存在文件对象可访问的缓冲区中。

于 2015-01-11T14:46:18.500 回答
3

在 2016 年 7 月 14 日之前,您无法配置multer为在本地存储文件。

但是multer只是 busboy 的包装busboy因此,如果我们想避免撞到磁盘,我们可以尝试直接使用。
Connect-bubbsboy将帮助我们:

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将文件作为 Buffer 存储在内存中。

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
于 2014-09-16T09:34:26.193 回答
0

您也可以将文件上传到 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  
});
于 2021-09-29T21:20:17.643 回答
-2

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

于 2019-01-01T20:22:31.950 回答