我的应用需求如下: 我将图像上传到 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 不将图像存储到我的本地系统?
2018 年 7 月:
因此,如果您想将图像存储到某种数据库中,您可能需要将其转换为缓冲区,然后将缓冲区插入数据库中。如果您使用
multer
处理多部分表单(在本例中是要上传的图像文件),您可以使用 multer
的 memoryStorage
直接获取图像的缓冲区。换句话说:
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
获取缓冲区:
当使用内存存储时,文件信息将包含一个名为 buffer 的字段,其中包含整个文件。
这意味着您可以从命令中获取缓冲区,如
req.files[0].buffer
我更新了一个简单的存储库,演示如何将图像上传到数据库,而无需在此存储库中将图像复制到本地
来自 Multer 信息页面: https://www.npmjs.com/package/multer
如果 inMemory 选项为 true - 不会写入任何数据 磁盘,但数据保存在文件对象可访问的缓冲区中。
2016 年 7 月 14 日之前,您无法配置
multer
在本地存储文件。
但是multer只是busboy的包装。所以,如果我们想避免撞到磁盘,我们可以尝试直接使用
busboy
。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 })
文件上传到 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
});
如果您不希望 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 });
这对我的开发很有用,尚未在生产中尝试过,但我认为应该如此。
如果您使用 Cloudinary 存储图像,请尝试使用 multer-storage-cloudinary