我这里使用的是koa-body
来接受文件:
const koa = require('koa')
//user路由
// const userRouter = require('../router/user.route')
//商品路由
// const goodsRouter = require('../router/goods.route')
const router = require('../router')
const koaBody = require('koa-body')
const koaStatic = require('koa-static')
const app = new koa()
const errHandler = require('./errHadnler')
const path = require('path')
app.use(koaBody({
multipart: true,
formidable: {
//设置保存文件的路径
//在配置选项的option里,这里不推荐写相对路径
//在option里的相对路径,不是相对的当前文件,而是相对于process.cwd()(脚本在哪里执行,相对于哪个路径)
//也可以相对于服务器的相对路径:
// uploadDir: './src/upload',
//一般这里使用绝对路径
uploadDir: path.join(__dirname, '../upload'),
//是否保留文件扩展名
keepExtensions: true
}
}))
//开放静态资源路径
app.use(koaStatic(path.join(__dirname, '../upload')))
//挂载
app.use(router.routes())
//注册中间件
/*app.use(userRouter.routes())
app.use(goodsRouter.routes())*/
//统一的错误处理:
app.on('error', errHandler)
// 导出:
module.exports = app
后端在存储文件之后,会将上传之后的文件信息挂载在ctx.files
上,而此时可以通过ctx.request.files.type
来获取上传文件的文件格式:
const path = require('path')
const {
fileUploadError, unSupportedFileType} = require('../constant/err.type')
class GoodsController {
//上传文件
async upload (ctx, next) {
const {
file} = ctx.request.files
const fileTypes = ['image/jpeg', 'image/png']
if (file) {
//如果不是fileTypes 中的文件格式,报错:
if ( ! fileTypes.includes(file.type)) {
return ctx.app.emit('error', unSupportedFileType, ctx)
}
ctx.body = {
code: 0,
message: '商品上传成功',
result: {
//获取文件最后的文件名:path.basename()
goods_img: path.basename(file.path)
}
}
} else {
return ctx.app.emit('error', fileUploadError, ctx)
}
}
}
module.exports = new GoodsController()
在list中写下想要支持的文件格式:
const fileTypes = ['image/jpeg', 'image/png']
判断是否是想要支持的文件格式:
fileTypes.includes(file.type)
如果不是,则直接returnctx.app.emit('error', fileUploadError, ctx)
注意,上面的步骤是在保存了文件之后再进行判断文件格式,所以会保存文件的,最稳妥的还是在上传文件的中间件判断