express新手,express使用multer多图片上传5张图片,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)
阅读 1.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进