如何在节点后端存储图像



我使用node和express作为后端,使用Mongo DB作为存储。我使用multer中间件来存储图像,我遇到了一个问题,问题是当我从本地主机存储图像时,它会保存在我的后端,也会显示在数据库中,但当我在heroku或任何其他应用程序上部署相同的api时,图像会显示在数据库中,但不会存储在我的后台。我已经在邮递员上测试了代码,可能是什么问题?

下面是我在节点js上的代码:

router.use(express.static(__dirname + 'public'));
let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
})
let upload = multer({ storage: storage })
router.post('/fellows-details', upload.single('image'), async (req, res) => {
const { error } = FellowsDetails(req.body);
if (error) return res.status(400).send({ message: error.details[0].message });
const fellow = new fellowdetails({
name: req.body.name,
details: req.body.details,
image: req.file.filename
})
try {
fellow.save()
res.status(200).send({ message: 'fellows detail saved successfully' })
} catch (err) {
res.status(400).send(err);
}
})

在字符串中转换后,存储文件将变得很容易你只需要在前端中转换图像中的字符串

在您的api中使用此代码将图像转换为base64字符串,也不要忘记从上传文件夹中删除文件

"img": new Buffer.from(fs.readFileSync(req.file.path)).toString("base64")

删除文件

let resultHandler = function (err) {
if (err) {
console.log("unlink failed", err);
} else {
console.log("file deleted");
}
}
fs.unlink(req.file.path, resultHandler);

在您的路线上导入multer

`multer const multer = require('multer');
const upload = multer({ dest: __dirname + '/uploads/images' });`

在您的请求中添加upload.single('img')

router.post('/fellows-details', authorize([Role.ADMIN, Role.USER]), 
upload.single('img'), usersController.fellowsdetails);

Heroku上的文件系统不适合持久存储数据。Heroku文件系统是短暂的,这意味着在dyno运行时对文件系统的任何更改都只会持续到该dyno关闭或重新启动。每个dyno都使用最近部署的文件系统的干净副本启动您无法在Heroku上存储文件。Heroku自动删除了您上传的文件。您必须使用外部服务,如AmazonS3或Azure Blob存储。

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-node-examples.htmlhttps://learn.microsoft.com/en-us/javascript/api/@azure/storageblob/blockblobclient?view=azure节点最新

如果你不想在AWS建立一个帐户来创建S3存储桶,我们这里也有处理静态资产存储和处理的附加组件https://elements.heroku.com/addons

var dateString=Date.now((;var storage=multer.diskStorage({

destination: (req, file, cb) => {
cb(null, './uploads/')

},

filename: (req, file, cb) => {
cb(null,  dateString+'_'+file.originalname)

}
});

var maxSize=3  1000  1000;

var upload = multer({ storage: storage,
limits: { fileSize: maxSize }})
var upload = multer({ storage: storage , limits: { fileSize: maxSize }});
app.post("/fileupload", upload.single("fileToUpload"), function (req, res) {

console.log(req.file.originalname)
var uploaded =  "http://localhost:4001/"+dateString+'_'+req.file.originalname;
console.log(uploaded)
res.json({status: 200,msg:'File saved successfully',data:uploaded});
});

最新更新