我第一次在Node.js和Multer库中处理多个文件.我在文件中有多个路径.例如,员工信息、产品等.有些路径只有一个字段用于输入文件,但有些路径有两个以上的字段用于输入文件.

条件句:

       1. I should handle the files into the best suitable directory,

       2. Rename each file to unique name in the directory.

       3. Return each new name to the main function to record into database and reusable.

这就是我所try 的.我还附上了一个链接到git项目,包括请求图像的例子.

Git项目: https://github.com/Kicks-Me/multer-file-handle.git

import * as multer from 'multer';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
import { v4 as uuidv4 } from 'uuid';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const mimeTypes = {
"image/png":"png",
"image/jpeg":"jpg",
"image/jpg":"jpg",
"image/gif":"gif",
"video/mp4":"mp4",
"audio/mpeg":"mp3",
"audio/wav":"wav",
"application/pdf":"pdf",
"application/vnd.ms-excel":"xls",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx"
};

const accessFilePath = (fileType, reqpath) => {
   let dest = "";
   let pathType = "uploads/Others";

   if(reqpath === "/location")
   {
      pathType = "uploads/locations";
   }
   else if(reqpath === "/employee")
   {
       pathType = "uploads/employees";
   }
   else if(reqpath === "/product")
   {
      pathType = "uploads/products";
   }


   dest =
     mimeTypes[fileType] === "mp4"
     ? path.join(__dirname, "..", pathType, "video")
     : mimeTypes[fileType] === "pdf"
     ? path.join(__dirname, "..", pathType, "documents", "pdf")
     : mimeTypes[fileType] === "xls" || mimeTypes[fileType] === "xlsx"
     ? path.join(__dirname, "..", pathType, "documents", "excel")
     : mimeTypes[fileType] === "mp3" || mimeTypes[fileType] === "wav"
     ? path.join(__dirname, "..", pathType, "audio")
     : mimeTypes[fileType] === "gif"
     ? path.join(__dirname, "..", pathType, "gif")
     : path.join(__dirname, "..", pathType, "image");

  return dest;
  };

  const multerConfig = {
   storage: multer.diskStorage({
     destination: (req, file, callback) => {

  let dest = "";
  const fileType = file.mimetype;

  dest = accessFilePath(fileType, req?.path);

  if (!fs.existsSync(dest)) {
    fs.mkdirSync(dest, { recursive: true });
  }

  callback(null, dest);
},

filename: (req, file, callback) => {
  const ext = mimeTypes[file.mimetype];
  callback(null, `${uuidv4()}.${ext}`);
},
}),

fileFilter: (req, file, callback) => {
const ext = mimeTypes[file.mimetype];

ext === "png" ||
ext === "jpg" ||
ext === "gif" ||
ext === "wav" ||
ext === "mp3" ||
ext === "wav" ||
ext === "mp4" ||
ext === "pdf" ||
ext === "xls" ||
ext === "xlsx"
  ? callback(null, true)
  : callback(null, false);
},
};

export const upload = multer.default(multerConfig);

 // Middleware to handle multiple files with different keys
export const handleMultipleFiles = (req, res, next) => {
const newImages = {};

 // Process files attached to 'Profile' key
if (req.file) {
   newImages.profile = req.file.filename;
 }

 // Process files attached to 'qr' key
 if (req.files && req.files.length > 0) {
   newImages.qr = req.files.map((file) => file.filename);
 }

  req.newImages = newImages;
 next();
};

这是路由

import Route from 'express';
import { verifyJWT } from '../helper/jwt.js';
import { handleMultipleFiles, upload } from '../helper/multer.js';
const route = Route();

route.post('/upload',verifyJWT, upload.single('Profile'), upload.array('Images', 5), 
  handleMultipleFiles, (req, res) => {
    const profileImage = req.newImages.profile;
    const qrImages = req.newImages.qr;

    return res.json({ profileImage, qrImages });
  });

export default route;

在上面的代码中,我遇到了一些错误:

 MulterError: Unexpected field
     at wrappedFileFilter (/Users/tplussmacbookpro2/Desktop/kkkk/file- 
 handle/node_modules/multer/index.js:40:19)
     at Multipart.<anonymous> (/Users/tplussmacbookpro2/Desktop/kkkk/file- 
 handle/node_modules/multer/lib/make-middleware.js:107:7)
     at Multipart.emit (node:events:514:28)
     at HeaderParser.cb (/Users/tplussmacbookpro2/Desktop/kkkk/file- 
 handle/node_modules/busboy/lib/types/multipart.js:358:14)

你可以在github上查看附加的项目以了解更多细节.

提前谢谢您.

推荐答案

上传多个带字段名的文件,可以是可选的,可以用.fields()方法处理.

因此,设置要处理的字段名:

upload.fields([
  {
    name: 'Profile'
    maxCount: 1,
  },
  {
    name: 'Images',
    maxCount: 5,
  },
])

然后,req.files将包含具有相应字段名的对象(如果提供,如果不提供,则该属性将不存在),例如,如果两个字段名都存在:

//  req.files
{
    Images: [file1, file2..],
    Profile: [file]
}

所以在文件处理程序中,你只需判断这些字段名的存在,并相应地分配文件名:

// Process files attached to 'Profile' key
  if(req.files.Profile) {

    newImages.profile = req.files.Profile[0].filename;
  }

 // Process files attached to 'qr' key
  if(req.files.Images) {
    newImages.qr = req.files.Images.map((file) => file.filename);
  }

完全修改后的代码:

道路:

   route.post('/upload',verifyJWT, upload.fields([
      {
        name: 'Profile'
        maxCount: 1,
      },
      {
        name: 'Images',
        maxCount: 5,
      },
    ]), handleMultipleFiles, (req, res) => {
    
        const profileImage = req.newImages.profile;
        const qrImages = req.newImages.qr;
    
        return res.json({ profileImage, qrImages });
      });

-你在说什么?

 // Middleware to handle multiple files with different keys
export const handleMultipleFiles = (req, res, next) => {
const newImages = {};

 // Process files attached to 'Profile' key
  if(req.files.Profile) {

    newImages.profile = req.files.Profile[0].filename;
  }

 // Process files attached to 'qr' key
  if(req.files.Images) {
    newImages.qr = req.files.Images.map((file) => file.filename);
  }

  req.newImages = newImages;
 next();
};

Node.js相关问答推荐

可以删除一个mongodb catch块

Windows上使用ES6+的OpenAPI规范的Express服务器不接受嵌套路由'

用于SLACK命令返回json而不是文本的AWS lambda函数

try 插入重复的邮箱时,mongoDB DuplicateKey 错误未定义

Nestjs swc 错误:找不到模块项目路径/src/app.module

Next.js 路由不起作用 - 页面未正确加载

将 POST 的 json 变量格式化为 lambda

2023年如何在Node.js中使用Gmail发送邮箱?

node_modules/preact/src/jsx.d.ts:2145:22 - 错误 TS2304:找不到名称SVGSetElement

每个数组值在 mongodb 中查找一个文档

Typescript typeRoots 未检测到类型定义

使用 Forms API 进行批量更新时生成 itemId

在多个 .env 文件之间切换,例如 .env.development 和 node.js

添加git信息到create-react-app

React Native ios build:找不到 node

在单独的模块中定义 Mongoose 模型

如何从 find 方法返回 Mongoose 结果?

yarn 和 npm 的主要区别是什么?

在 Node.js 上使用 Connect 无法获取 /

deno vs ts-node:有什么区别