koa上传文件

const Koa = require('koa');
const Router = require('koa-router');
const body = require('koa-body');
const cors = require('koa-cors');

const path = require('path');
const fs = require('fs');

const app = new Koa();
const router = new Router();

app.use(cors());

const koaBodyOptions = {
    multipart: true,
    encoding: 'gzip',
    formidable: {
        uploadDir: path.join(__dirname, './upload'),
        keepExtensions: true,         // 会直接保留原始的文件后缀
        maxFileSize: 200 * 1024 * 1024,    // 设置上传文件大小最大限制,默认2M
        onFileBegin: (name, file) => {

            // 获取文件后缀
            const ext = getUploadFileExt(file.name);

            // 最终要保存到的文件夹目录
            // const dir = path.join(__dirname, `./upload/${getUploadDirName()}`);

            // 检查文件夹是否存在如果不存在则新建文件夹
            // checkDirExist(dir);

            // 重新覆盖 file.path 属性
            // file.path = `${dir}/${getUploadFileName(ext)}`;
        },
        onError: (err) => {
            console.log(err);
        }
    }
}

/**
 * 只是在upload添加上传中间件,其实也是可以直接use,因为koa-body包含了post请求
 * application/json
 * multipart/form-data
 * application/application/x-www-form-urlencoded
 */
router.post('/upload', body(koaBodyOptions), async ctx => {
    console.log(ctx.request.body);
    console.log(ctx.request.files);

    let { file01 } = ctx.request.files;

    const reader = fs.createReadStream(file01.path);

    let filePath = path.join(__dirname, './') + `${file01.name}`;
    const upStream = fs.createWriteStream(filePath);

    reader.pipe(upStream);

    ctx.body = 'ok';
});


app.use(router.routes());

app.listen(9090);

// ========================================

/**
 * 判断文件夹是否存在 如果不存在则创建文件夹
 * @param {*} p 
 */
function checkDirExist(p) {
    if (!fs.existsSync(p)) {
        fs.mkdirSync(p);
    }
}

/**
 * 获取文件的后缀
 * @param {*} name 
 */
function getUploadFileExt(name) {
    let ext = name.split('.');
    return ext[ext.length - 1];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值