Загрузить изображение дубликат (миниатюра с низким разрешением) через multerjs

#node.js #express #multer

#node.js #экспресс #мультер

Вопрос:

Я создаю веб-приложение, которое позволяет пользователям загружать аватар. Однако в дополнение к аватару я хочу создать эскиз с низким разрешением (например, 64 x 64) и сохранить его на своем сервере. В настоящее время я использую этот код для хранения изображения в двух каталогах, но в обоих каталогах оно имеет одинаковое разрешение. Как мне сохранить другое разрешение в каталоге эскизов?

  var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads/thumbs');
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
    callback(null, file.fieldname   '-'   Date.now());
  }
});
  

Ответ №1:

Вы можете использовать sharp для изменения размера изображений в вашем маршрутизаторе:

 const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, './uploads')
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname   '-'   Date.now()   path.extname(file.originalname))
    }
})
  

и:

 router.post('/', upload.single('image'), async (req, res) => {    
    try {
        const { filename: image } = req.file
        await sharp(req.file.path, { failOnError: false })
            .resize(64, 64)
            .withMetadata()
            .toFile(
                path.resolve(req.file.destination, './thumbs', image.replace(/.(jpeg|png)$/, `.jpg`))
            )
        fs.unlink(req.file.path)
        return res.json({
            thumb_url: '/uploads/thumbs/'   image.replace(/.(jpeg|png)$/, `.jpg`)
        });
    } catch (err) {
        console.error(err.message);
        res.status(500).send('Server Error!');
    }
});
  

fs.unlink(req.file.path) удалите исходное изображение из ./uploads

Комментарии:

1. Ошибка: входной файл отсутствует, я использую фактически тот же код, а req.file.buffer тоже не определен???

2. если вы используете multer и express-fileupload вместе, вам следует удалить express-fileupload или аналогичную библиотеку загрузки файлов