node.js - 如何使用 NodeJs 上传图片?
问题描述
我想使用 Node Js 上传产品图片。所以我用multer上传图片。我用邮递员测试它是否工作,但它返回Please upload a file
. 我改变了另一个图像然后它说PayloadTooLargeError: request entity too large
。
我的代码
const express = require("express");
const router = express.Router();
const multer = require('multer');
const storage = multer.diskStorage(
{
destination: function(req, file, cb)
{
cb(null, './uploads/');
},
filename: function(req, file, cb)
{
cb(null, new Date().toISOString() + file.originalname);
}
});
const fileFilter = (req, file, cb) =>
{
// reject a file
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png')
{
cb(null, true);
}
else
{
cb(null, false);
}
};
const upload = multer(
{
storage: storage,
limits:
{
fileSize: 1024 * 1024 * 50
},
fileFilter: fileFilter
});
router.post("/upload", upload.single('productImage'), (req, res, next) =>
{
if (!req.file)
return res.send('Please upload a file')
var tempPath = req.file.path
console.log(tempPath);
});
包.json
{
"name": "api",
"version": "1.0.0",
"description": "testing version",
"main": "server.js",
"dependencies": {
"express": "^4.16.4",
"multer": "^1.3.0",
"nodemon": "^1.18.10",
},
"devDependencies": {},
"scripts": {
"test": "node server.js",
"start": "nodemon server.js"
},
"keywords": [
"api"
],
"author": "tteam",
"license": "ISC"
}
解决方案
转换为字符串后存储文件将变得很容易,您只需在前端将字符串转换为图像
在您的 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
:
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
);
如果您不使用该unlink
函数,则会导致错误,因为它首先将buffer
值存储在文件夹中,然后将其转换为base64
.
推荐阅读
- java - 如何在运行时获取“colorControlHighlight”属性的值?
- django - nginx 停止使用 WSL 为 django 应用程序提供静态文件夹
- sql - Postgres:为什么我需要在 max() 中引用列名?
- jvm - 由于 grpc-netty-shaded-1.19.0.jar,谷歌云 Firestore 无法在 32 位 JVM 中运行
- c# - 使用 Ninject 加载多个绑定
- json - 从 Angular 中的服务器导入 JSON
- jquery - if/else 对 td 中的类不执行任何操作
- mysql-python - 为 python 2.7 安装 MySQLdb 返回错误
- amazon-cloudformation - 如何修复逻辑 ID 上资源之间的循环依赖关系
- wordpress - 如何通过更改 wp 查询而不重新加载页面从一个页面重定向到另一个页面?