乐趣区

koabodynodejs-koa中间件文件上传搭建文件服务

前言

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/…

愿你保持独立思考、不卑、不亢、不怂努力长成自己喜欢的样子

我是一只孤独的狼 …… 欢迎 star

退出移动版