мультер: Как обрабатывать файлы и манипулировать ими перед сохранением?

#node.js #multer #sharp

Вопрос:

Я хочу обработать изображения с помощью sharp перед сохранением, поэтому мне не нужно сохранять файл дважды (один за multer другим sharp ). Лучший способ, который я нашел, — сохранить файл в памяти с инициализацией multer без аргументов:

 const upload = multer()
 

а затем передать файловый буфер в sharp в обработчике маршрута:

 await sharp(req.file.buffer)
        .resize(500)
        .jpeg({ quality: 50 })
        .toFile(path)
        );
 

Если есть лучший способ, дайте мне знать.

Лучшим вопросом было бы: есть ли что-то вроде крючка в мультере, который вызывает перед сохранением? таким образом, я могу изменить содержимое файла перед его сохранением.

Ответ №1:

процесс начинается с метода FileFilter, затем имя файла multer, поэтому вы должны начать изменять его размер в FileFilter, сохранить его во временном каталоге, затем изменить изображение после изменения размера, которое вы можете использовать .В файле пакета sharp он сохранит место назначения внутри .toFile(«./загрузить») файл-картограф.ts (используется для возврата другого объекта)

 export const fileMapper = ({ file, req }: FileMapper) => {
  if (!file) {
    return null!;
  }
  const fileName = editFilename(req.file);
  const image_url = `${req.protocol}://${req.headers.host}/${req.file.destination}/${fileName}`;
  resizeImage(req, fileName);
  return {
    filename: file.filename,
    image_url,
    path: file.path,
  };
};
 

мой размер-изображение.ts

 import { Request } from 'express';
import path from 'path';
import sharp from 'sharp';
import fs from 'fs';
export const resizeImage = async (req: Request, fileName: string) => {
  await sharp(req.file.path)
    .resize({ height: 700, width: 700, position: 'center' })
    .jpeg({ quality: 90, chromaSubsampling: '4:4:4' })
    .toFile(path.resolve(req.file.destination, fileName))
    .then((sharpOutPut) => {
      if (sharpOutPut) fs.unlinkSync(req.file.path);
    })
    .catch((err) => {
      throw err;
    });
};
 

дисковое хранилище.ts

 const storage= diskStorage({
        destination: 'upload/product',
        filename: editFileName,
      }),
      fileFilter: imageFileFilter,
    })
 
  • используйте sharp в фильтре файлов мультера
  • Я использую файлообменник, потому что хочу получить новый объект для своей БД