egg.js实现上传文件

前序准备配置


config.default.js文件中配置文件路径和参数
  // 上传文件时,配置multipart参数  mode参数的可选值  file  stream
  config.multipart = {
    fileSize: '50mb',
    mode: 'file',
    fileExtensions: ['.png','.jpg'], // 扩展几种上传的文件格式
  };
  //配置外部访问本地图片的路径的名字
  config.assets = {
    publicPath: 'app/public/文件名',
  }

具体使用 (以下代码一般写在控制器 controller)


注意:导入此段代码,不论是file类型还是stream类型,都需要使用。

const Controller = require('egg').Controller;
// ----定义写入文件时,需要导入的文件------
const fs = require('mz/fs');
const path = require('path');

1.mode的参数为file的类型时

  async upload() {
    const { ctx } = this
    // 获取前端传过来的第一个文件 如果前端传过来的是多个文件 就要选择遍历的方式去过去每个文件
    let file = ctx.request.files[0]
    // 给文件命名 以时间戳命名,避免重复
    const name = new Date().getTime()+path.extname(file.filename);
    // 读取文件流
    file = fs.readFileSync(file.filepath)
    // 写入文件流
    fs.writeFileSync(path.join('./', `app/public/XXXX/${name}`), file)
    // 返回前端访问链接
    let url = `xxxxxxxx/public/uploads/${name}`;
    // 返回文件上传处理结果
    ctx.body = {
      code: 200,
      data: {
        imgUrl: url
      },
      msg: '上传成功',

    }
  }

2.mode的参数为stream时

async upload() {
    const {
      ctx
    } = this;

    let stream = await ctx.getFileStream()
    let filename = new Date().getTime() + path.extname(stream.filename) // stream对象也包含了文件名,大小等基本信息

    // 创建文件写入路径
    let target = path.join('./', `/app/public/XXXX/${filename}`)

    const result = await new Promise((resolve, reject) => {
      // 创建文件写入流
      const remoteFileStrem = fs.createWriteStream(target)
      // 以管道方式写入流
      stream.pipe(remoteFileStrem)
      let errFlag
      // 监听error事件
      remoteFileStrem.on('error', err => {
        errFlag = true
        // 停止写入
        sendToWormhole(stream)
        remoteFileStrem.destroy()
        console.log(err)
        reject(err)
      })

      // 监听写入完成事件
      remoteFileStrem.on('finish', () => {
        if (errFlag) return
        resolve({
          filename,
          name: stream.fields.name
        })
      })
    })
    // 返回前端访问链接
    let url = `XXXXX/public/XXXX/${filename}`;
    // 返回文件上传处理结果
    ctx.body = {
      code: 200,
      data: {
        imgUrl: url
      },
      msg: '上传成功',

    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值