首页 > 解决方案 > 如何使用 NodeJs 上传图片?

问题描述

我想使用 Node Js 上传产品图片。所以我用multer上传图片。我用邮递员测试它是否工作,但它返回Please upload a file. 我改变了另一个图像然后它说PayloadTooLargeError: request entity too large

无法检测图像

ayloadTooLarge

我的代码

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"
}

标签: node.jsmulter

解决方案


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

在您的 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.


推荐阅读