前序准备配置
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: '上传成功',
}
}