#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 в фильтре файлов мультера
- Я использую файлообменник, потому что хочу получить новый объект для своей БД