前端小赖 2021-11-10 14:57
浏览 52
已结题

关于#node.js#的问题:我在前端上传5张图片,express接收multer处理过的图片,然后再用webp-converter压缩图片但是req.files接收到的数组只有1张图片

我在前端上传5张图片,express接收multer处理过的图片,然后再用webp-converter压缩图片
但是req.files接收到的数组只有1张图片。最后的处理结果并没有返回图片的返回地址,请问改该如何解决

前端使用axios上传图片代码

export function uploadimgs(FormData){
    return request({
        url:'/articles/uploadimg',
        method:'post',
        data:FormData,
        // 发送图片格式
        contentType: 'multipart/form-data'
    })
}

express处理

控制层

// 文章内容图片
const postarticlesimg = async (req, res) => {
    //储存图片路径
    const imgurls = [];
    console.log('数组的长度是:',req.files);
    if (req.files.length === 0) {
        res.json({
            code: 400,
            message: '上传文件不能为空!',
        })
        return;
    } else {
        const imgtmp =  converter(req.files[0]);
        if (imgtmp) {
           imgurls.push(imgtmp)
        }
        res.json({
            status: 200,
            message: '上传成功',
            data: {
                imgUrl: imgurls,

            }
        })      }}
module.exports = {
    getArticlesList,
    postimg,
    postarticlesimg
}

中间件
multer中间件

const multer = require('multer')
const path = require('path')
const fs = require('fs')
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        let date = new Date();
        let year = date.getFullYear();
        let month = (date.getMonth() + 1).toString().padStart(2, '0');
        let day = date.getDate();
        // 上传图片存放的目录
        let dir = "./public/upload/articlesimg" + year + month + day;
        // 判断目录是否存在,没有则创建
        if (!fs.existsSync(dir)) {
            fs.mkdirSync(dir, { recursive: true })
        }
        cb(null, dir);
    },
    // 自定义的文件名
    filename: function (req, file, cb) {
        // var fileFormat = (file.originalname).split(".");
        // cb(null, fileFormat[0] + '-' + Date.now() + "." + fileFormat[fileFormat.length - 1]);
        // 获取文件后缀名
        let fileName = Date.now() + path.extname(file.originalname);
        // fileName是上传文件的文件名
        cb(null, fileName);
    }
    // 
})

//设置过滤规则(可选)
var imageFilter = function (req, file, cb) {
    var acceptableMime = ['image/jpeg', 'image/png', 'image/jpg', 'image/gif']
    if (acceptableMime.indexOf(file.mimetype) !== -1) {
        cb(null, true)
    } else {
        cb(null, false)
    }
}
//设置限制(可选)
const imageLimit = {
    fieldSize: '2MB'
}
// uploadImg.array('file',12),接收以'file'命名的上传文件数组,限制最多上传12个文件
const uploadmany = multer({ storage: storage,fileFilter: imageFilter, limits: imageLimit }).array('images', 12);//file为上传时的name值,例如el-upload要设置name=“file”,element-ui自定义上传的时候需要也要用fs.append("file",file.file),参数一和single(file)里面的参数相同

module.exports = {
    uploadmany
}

    ```

webp-converter中间件

// 压缩图片为webp格式
const webp = require('webp-converter');
const fs = require('fs')
exports.converter =async function  (file) {
  // var img = file.filename; // 图片名字
  var imgType = file.mimetype; // 图片类型
  var url = (file.path).replace(/\\/g, '/'); // 图片地址
  if (imgType == "image/png" || imgType == "image/jpeg") {
    // 压缩转换为webp格式图片 webp.cwebp前两个参数,第一个为原文件地址,第二个为生成的目标文件
    webp.cwebp(url, (file.path).replace(/\\/g, '/').split(".")[0] + ".webp", "-q 80", logging = "-v").then(response => {
      console.log(response);
    })
    // 压缩图片为webp格式后删除原文件
   
    var oldUrl = (file.path).replace(/\\/g, '/'); // 原文件地址
    fs.unlinkSync(oldUrl, function (error) {
      if (error) {
        console.log(error);
        return false;
      }
      console.log('删除文件成功');
      const imgurl = "http://localhost:3008/" + (file.path).replace(/\\/g, '/').split(".")[0] + ".webp"
      console.log("是否返回图片地址", imgurl);
      return imgurl;
    })

  }
}


路由

router.post('/articles/uploadimg',uploadmany,postarticlesimg)
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月18日
    • 创建了问题 11月10日

    悬赏问题

    • ¥15 ansys fluent计算闪退
    • ¥15 有关wireshark抓包的问题
    • ¥15 Ubuntu20.04无法连接GitHub
    • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
    • ¥15 向数据表用newid方式插入GUID问题
    • ¥15 multisim电路设计
    • ¥20 用keil,写代码解决两个问题,用库函数
    • ¥50 ID中开关量采样信号通道、以及程序流程的设计
    • ¥15 U-Mamba/nnunetv2固定随机数种子
    • ¥30 C++行情软件的tick数据如何高效的合成K线