前言
koa 作为 node 服务的解决方案,koa-body 作为 koa 的中间件,对文件上传和 POST JSON,设置 json 打大小和上传文件的大小, 都比较友好。koa-static 提供了服务静态文件访问
需求
上传图片接口,根据当前日期保存文件目录“年 / 月 /SDK_20190904153509.png”,以分割年月份进行文件管理
安装
npm install koa koa-router
npm install koa-body
npm install koa-static
// 保存到本地项目,需要加后缀 --save-dev
app.js
const koa=require("koa")
const Router=require('koa-router')
const koaBody = require('koa-body')
const koaStatic = require('koa-static')
const {upload}= require('upload.js')
const router=new Router()
const app=new koa()
// koa-body 中间插件 文件提交及 form-data
app.use(koaBody({
formLimit: '1mb',
multipart: true, // 允许上传多个文件
formidable: {
maxFileSize:200 * 1024 * 1024 // 上传文件大小
keepExtensions: true, // 保存图片的扩展名
}
}))
// 配置静态资源加载中间件
app.use(koaStatic(path.join(“/f\upload”) // 读取静态文件目录
))
// Post
router.post('/login',async (ctx,next)=>{console.log('login Success!')
//ctx.request.body 用于获取 post 的参数
ctx.body=ctx.request.body;
})
//koa-router
app.use(upload()) // 路由
app.use(route).use(router.post('/upload',upload));
app.listen(3000)
upload.js
/*
文件上传
*/
const fs = require('fs');
const path = require('path');
const dateFormat = require('../utils/dateFormat.js')
const upload= {
UPLOAD: '/upload',
IMAGE: '/image/',
FILE: '/file/',
MAXFILESIZE: 200 * 1024 * 1024, // 上传文件大小
}
// 创建文件目录
const mkdirFile = (path) => {let pathList = path.split('/');
let fileDir = ''
pathList.forEach(i => {if(i) {fileDir += ('/' + i)
if(!fs.existsSync(fileDir)) {
fs.mkdirSync(fileDir, err => {LogFile.info('创建失败', err)
return
});
}
}
})
}
// 保存文件
const saveFile = (file, path) => {return new Promise((resolve, reject) => {let render = fs.createReadStream(file);
// 创建写入流
let upStream = fs.createWriteStream(path);
render.pipe(upStream);
upStream.on('finish', () => {resolve(path)
});
upStream.on('error', (err) => {reject(err)
});
})
}
/**
* 文件上传
* ps 生成文件名为 SKD_日期
* 文件路径根据年月分存放
*/
const uploadImg = async ctx => {var time = Date.parse(new Date())
let date = dateFormat.dateFormat(time, 'yyyyMMddhhmmss');
let file = ctx.request.files.file;
let fileName = 'SKD_'+ upload.UPLOAD + upload.IMAGE // 上传保存目录
let fileYear = date.substring(4, 8) + '/' +
date.substring(8, 10);
let tail = file.name == 'blob' ? 'png' : file.name.split('.').pop()
let filePath = path.join(fileName, fileYear, date + '.' + tail); // 根据时间拼接好文件名称
await mkdirFile(fileName + fileYear) // 创建文件目录
await saveFile(file.path, filePath).then(su => {let uplaod_img = su.substring(upload.UPLOAD.length, su.length)
ctx.body = {
error_code: 10000,
error_message: '上传文件成功',
realName: uplaod_img,
}
}).catch(err => {
ctx.body = {
error_code: 20008,
error_message: '上传文件失败!',
}
})
}
module.exports = {uploadImg};
ps:fs,path npm 安装,日期工具类可查看 dateFormat.js
图片访问地址:http://localhost:3000/image/2019/09/SDK_20190904153509.jpg
项目地址 https://github.com/shanyanwt/…
愿你保持独立思考、不卑、不亢、不怂努力长成自己喜欢的样子