koa-body,nodejs koa中间件文件上传,搭建文件服务

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

前言

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

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看