【问题标题】:Store images in node express hbs - what way to choose?在 node express hbs 中存储图像 - 选择什么方式?
【发布时间】:2020-09-01 10:42:09
【问题描述】:

我完成了我的(第一个和真实的)nodejs、express、handlebars 项目。 现在,我可以在“真实”服务器上看到应用程序,也可以看到实际问题。

应用程序非常简单:用户可以发布添加(如 craiglist)。

我在公共/上传中使用 multer 存储图像,只有一个要求:只是为了能够上传图像(png、jpeg)。

问题来了,因为人们可以为服务器上传非常重的图像。 我正在寻找一些解决方案,但就我的实际知识而言,一切看起来都非常复杂。 所以,第一个问题:

你会走哪条路?

  • 保存图片,然后在服务器端压缩

  • 在通过 multer 存储之前,调整大小并转换为更轻的文件 (欢迎提供更多想法)

我看到了许多模块,如锐化、浏览器图像压缩等,但正如我所说,这超出了我的实际理解。

有什么更简单的方法可以达到我的目标吗?

更新:

这是我的路线文件:

const express = require('express');
const router = express.Router();
const adsController = require('../controllers/ads.controller');
var multer  = require('multer')
var upload = multer({ dest: 'public/uploads', limits: { fileSize: 3000000 } });
const secure = require('../middleware/secure.mid');

...

router.post('/publicar-anuncio/:categoryId', upload.array('image'), adsController.doPost)

更新 2:

// controller

    const {name, title, description, email } = req.body;
        const imageUpload = [];
        console.log(req.files)
        req.files.map(eachPath => imageUpload.push(`uploads/${eachPath.filename}`))

        const newMiscAd = new Misc ({name,title,description,email,image:{imgPath:imageUpload} })

....

User.findOne({email:email})
      .then(user => {
        if(user !== null){
          console.log(`User ${user.email} already exists`)
          newMiscAd.save()
          .then(ad => {
            User.updateOne({email:ad.email},{$push:{misc:ad._id}})
            .then(() => {
              createAdEmail({newAdEmail});

              res.render('ads/adSuccess')
            })            
          })
          .catch(error => {
            if (error instanceof mongoose.Error.ValidationError) {
              console.log(error)
              renderWithErrors(error.errors)
            } else {
                console.log('issue #userExist')
                next(error)
            }
          })
        } else {
          //new user through posting
          console.log(`User ${email} is new user MISC`)
          newMiscAd.save()
          .then(newAdData => {
            createAdEmail({newAdEmail});
            res.render('users/postSignup',{email:newAdData.email,id:newAdData._id,categoryAd:newAdData.category})
          })
          .catch(error => { 
// whatever
}

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    multer 实际上给了你这个选项。在后端,您可以定义将由客户端上传的图像大小,在将其保存到数据库之前,将其转换为二进制文件类型。它还可以帮助您显着减小尺寸

    代码更新:

    const multer = require('multer')
    const sharp = require('sharp')
    const router = new express.Router()
    
        var upload = multer({ 
            dest: 'public/uploads', 
            limits: { 
              fileSize: 3000000 } ,
            fileFilter(req, file, cb) {
            if (!file.originalname.match(/\.(jpg|jpeg|png)$/)) {
                return cb(new Error('Please upload an image'))
            }
            cb(undefined, true)
        }
             });
    
    
    router.post('/publicar-anuncio/:categoryId', upload.single('image'), async (req, res) => {
        const buffer = await sharp(req.file.buffer).resize({ width: 250, height: 250 }).png().toBuffer()
        req.user.avatar = buffer
        await req.user.save()
        res.status(201).send()
    }, (error, req, res, next) => {
        res.status(400).send({ error: error.message })
    })
    

    【讨论】:

    • 在数据库方面还有一件事,您必须定义图像类型“缓冲区”
    • 我的控制器呢? router.post('/publicar-anuncio/:categoryId', upload.array('image'), adsController.doPost) 这就是问题所在,如何在这里捕获错误并发送到控制器
    • 抱歉,我忘记在此处添加您的控制器了。你可以添加它。
    • 我正在努力,非常感谢您,我会尽快通知您!
    • 欢迎您! .祝你项目的其余部分好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2010-12-22
    • 1970-01-01
    • 2011-08-09
    • 2013-10-26
    • 2019-12-21
    相关资源
    最近更新 更多