Node.js 如何直接在cloudinary上上载图像而不将其存储到本地目录?

Node.js 如何直接在cloudinary上上载图像而不将其存储到本地目录?,node.js,reactjs,express,multer,cloudinary,Node.js,Reactjs,Express,Multer,Cloudinary,我是ExpressJs新手,正在为reactjs中创建的一个仪表板创建api。仪表板中有一个表单,用于收集来自用户的一些信息,如“标题”、“说明”和“图像”。我已经创建了一个express服务器来收集这些信息并将其保存到mongodb中。对于图片,我所做的就是将图片上传到数据库,并将上传的url和公共id存储到数据库中 所以在学习了一些教程之后,我做了一些类似的事情 index.js const express=require(“express”); const bodyParser=requi

我是ExpressJs新手,正在为reactjs中创建的一个仪表板创建api。仪表板中有一个表单,用于收集来自用户的一些信息,如“标题”、“说明”和“图像”。我已经创建了一个express服务器来收集这些信息并将其保存到mongodb中。对于图片,我所做的就是将图片上传到数据库,并将上传的url和公共id存储到数据库中

所以在学习了一些教程之后,我做了一些类似的事情

index.js

const express=require(“express”);
const bodyParser=require(“body parser”);
const cors=要求(“cors”);
常数db=要求(“./db”);
//Api路由器导入到这里
const sectionTypesRouter=需要(“./路由/部分类型路由器”);
常量app=express();
常数apiPort=3000;
use(bodyParser.urlencoded({extended:true}));
应用程序使用(cors());
use(bodyParser.json());
db.on(“error”,console.error.bind(console,MongoDB连接错误:);
应用程序获取(“/”,(请求,请求)=>{
res.send(“你好,世界!”);
});
应用程序使用(“/api”,节类型外部);
app.listen(apiPort,()=>console.log(`Server running on port${apiPort}`));
首先,我创建了一个文件multer.js

const multer=require(“multer”);
const storage=multer.diskStorage({
目的地:“公共/上传”,
文件名:(请求、文件、cb)=>{
cb(null,file.fieldname+“-”+Date.now());
},
});
常量文件过滤器=(请求、文件、cb)=>{
如果(file.mimetype==“image/jpeg”| | file.mimetype===“image/png”){
cb(null,true);
}否则{
//拒绝文件
cb({message:“不支持的文件格式”},false);
}
};
const upload=multer({
存储:存储,
fileFilter:fileFilter,
});
module.exports=上传;
下面是我的api路由器节型路由器.js

const express=require(“express”);
const upload=require(“../utils/multer”);
const SectionTypesCtrl=require(“../controllers/sectiontypes ctrl”);
const router=express.router();
转发器(
“/节类型”,
上传。单张(“图像”),
SectionTypesCtrl.createSectionType
);
路由器.get(“/section-types”,SectionTypesCtrl.getSectionTypes);
module.exports=路由器;
这是节类型ctrl.js:

const SectionType=require(“../models/SectionType model”);
常数fs=要求(“fs”);
常量路径=要求(“路径”);
const cloudinaryUploader=require(../utils/cloudinaryUploader”);
const createSectionType=async(请求、恢复)=>{
const body=请求body;
如果(!正文){
返回res.status(400).json({
成功:错,
错误:“缺少必需的参数”,
});
}
云雾播放机
.uploads(req.file.path,“节类型”)
。然后((结果)=>{
const sectionType=新的sectionType({
标题:body.title,
description:body.description,
图片:{
url:result.url,
publicId:result.public\u id,
},
});
截面类型
.save()
.然后(()=>{
返回res.status(201.json)({
成功:没错,
id:sectionType.\u id,
消息:“已创建节类型!”,
});
})
.catch((错误)=>{
返回res.status(400).json({
错误,
消息:“未创建节类型!”,
});
});
})
.catch((错误)=>{
资源状态(500)。发送({
信息:“失败”,
错误,
});
});
};
module.exports={
createSectionType,
};
最后是cloudinaryUpload.js

const cloudinary=require(“../config/cloudinary”);
exports.uploads=(文件、文件夹)=>{
返回新承诺((解决)=>{
cloudinary.uploader.upload(
文件
{
资源类型:“自动”,
文件夹:文件夹,
},
(错误,结果)=>{
如果(!err){
决心({
url:result.url,
public\u id:result.public\u id,
});
}否则{
犯错误;
}
}
);
}).catch((错误)=>{
投掷误差;
});
};

现在,一切正常。图像正在上传到cloudinary,返回的url和公共id存储在数据库中。但问题是我上传的图像也上传到本地目录public/uploads/。这可能会在托管站点时产生存储问题。那么,有没有最好的方法可以直接将图像上传到cloudinary,而无需在本地目录中创建副本,而本地目录也可以在生产模式下工作?

在您的示例中,文件被存储到服务器上的
public/uploads
,因为您是通过
multer.diskStorage

正如@Molda上面的评论所说,您可以通过使用
multer storage cloudinary
包让multer自动将文件存储在cloudinary中来避免这种情况

另一种可能是更改您使用Multer的方式,使其不会将文件存储在任何位置,然后在上传的文件位于内存中时将其作为流传递给Cloudinary的SDK

Cloudinary网站上的这篇博文中有一个例子:


在您的情况下,您可以停止使用
multer.diskStorage
,而只使用
multer()
,然后使用Streamizer或其他库将上载的文件转换为流,并将其传递给
cloudinary.uploader.upload\u stream()

我还尝试用谷歌搜索了multer的npm模块“express.js cloudinary上载而不将文件存储在本地驱动器上“如果你找到了足够的信息可以帮助你做到这一点,那么也可以试试谷歌。当我们托管应用程序时,它会很好吗?”?我的意思是,如果直接上传而不在本地存储,您确定不会有问题吗?我还发现使用
upload\u-stream