在使用koa2进行文件上传的时候,我写了一个中间件用来处理url,然而我在从新配置上传文件的url的时候,需要指定一下,upload.single('file'),这让我原来的url处理中间件会出错,才开始,我在中间件的Post那里做了个判断,如果url===“”uploadFile“”,增加upload.single('file'),然而上床文件没有什么反应。

最后突然看到,我的中间件那里可以自定义一个新的函数,让中间件函数处理的不是.js文件,而是自定义一个新的函数,专门用来处理文件上传,这样也不用在原来的主文件中增加代码,妨碍主文件的可读性。废话不说上代码:

controller.js

var fs = require('fs');
function addMapping(router,mapping) {for (var url in mapping) {if (url.startsWith('GET')) {//如果url类似GET ***var path = url.substring(4);router.get(path,mapping[url]);console.log(`register URL mapping:GET ${path}`);} else if (url.startsWith('POST')) {var path = url.substring(5);router.post(path,mapping[url]);console.log(`register URL mapping: POST ${path}`);} else if (url.startsWith('PUT')) {var path = url.substring(4);router.put(path,mapping[url]);console.log(`register URL mapping: PUT ${path}`);} else if (url.startsWith('DELETE')) {var path = url.substring(7);router.del(path,mapping[url]);console.log(`register URL mapping: DELETE ${path}`);}else {console.log(`invalid URL :${url}`);}}
}
function addControllers(router,dir) {//使用sync是因为启动时只用一次,不存在性能问题fs.readdirSync(__dirname + '/'+ dir).filter((f) => {//过滤出.js文件return f.endsWith('.js');}).forEach((f) => {console.log(`process controller:${f}...`);//导入js文件let mapping = require(__dirname + '/' + dir + '/' + f);addMapping(router,mapping);});
}
function addUploadFile(router) {//文件上传const multer = require('koa-multer');//配置var storage = multer.diskStorage({//文件保存路径destination:function (req,file,cb) {cb(null,'./public/uploads/img/')},filename:function (req,file,cb){var fileFormat = (file.originalname).split(".");cb(null,Date.now() + "." + fileFormat[fileFormat.length - 1]);}})var upload = multer({storage:storage});//upload.single('file')这里面的file是上传空间的name<input type="file" name="file"/>  router.post('/uploadFile',upload.single('file'),async (ctx,next) => {ctx.response.body ="<h1>上传成功!</h1>";/*ctx.body = {  filename: ctx.req.file.filename//返回文件名  } */ctx.redirect('/index');})console.log(`register URL mapping: POST /uploadFile`);
}
module.exports = function (dir) {let controllers_dir = dir || 'controllers',router = require('koa-router')();addControllers(router,controllers_dir);addUploadFile(router);return router.routes();
};

app.js

const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const controller = require('./controller');
const templating = require('./templating');
const app = new Koa();const isProduction = process.env.NODE_ENV === 'production';app.use(async(ctx,next) => {console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);var start = new Date().getTime(), execTime; await next(); execTime = new Date().getTime() - start; ctx.response.set('X-Response-Time', `${execTime}ms`);
});app.use(bodyParser());app.use(templating('views',{noCache: !isProduction,watch: !isProduction
}));// static file support:
let staticFiles = require('./static-files');
app.use(staticFiles('/static/', __dirname + '/static')); app.use(controller());
app.listen(3000);
console.log('app started at port 3000....');

这样就完美的使用了中间件处理了文件上传。

koa2实现文件上传。相关推荐

  1. Koa2利用koa-body实现文件上传需要注意的问题

    koa-body是一款为实现文件上传的中间件. 本文主要就利用该插件实现上传时遇到的问题进行些整理. 1 ctx.request.files.file  ---------->终端提示undef ...

  2. VUE3+ElementPlus如何实现文件上传

    VUE3+ElementPlus如何实现文件上传 使用elementplus 中的组件 el-upload 以上传单张图片为例: 使用el-upload <el-uploadref=" ...

  3. node 生产的env文件怎么注入_前端各种文件上传攻略,从小图片到大文件断点续传...

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  4. 写给新手前端的各种文件上传攻略,从小图片到大文件断点续传

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  5. 前端各种文件上传攻略,从小图片到大文件断点续传

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  6. springboot设置文件上传大小(tomcat默认1M)

    application.yml # 设置文件上传大小(tomcat默认1M) server:tomcat:max-http-form-post-size: -1 spring:servlet:mult ...

  7. 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录

    将文件上传至ftp服务器,传入File对象,将文件上传至ftp服务器 需要配置修改的点: 1. 服务器ip端口(服务器ip 端口22/21). 2. 服务器账号密码(服务器登录用户名密码). 3. 上 ...

  8. Springboot 多文件上传

    其实多个文件和单个文件上传是一样的,可以使用同一个Controller 添加依赖 <!-- https://mvnrepository.com/artifact/commons-fileuplo ...

  9. django文件上传

    Django在处理文件上传时,文件数据被打包封装在request.FILES中. 一.简单上传 首先,写一个form模型,它必须包含一个FileField: # forms.py from djang ...

最新文章

  1. ruby gems列表
  2. 阿里云异构计算团队亮相英伟达2018 GTC大会
  3. 网络主机监控-nagios应用漫谈(三)
  4. ListView.setOnItemClickListener 点击无效
  5. H3C DHCP中继实验
  6. 企业微信应用权限签名api记录
  7. 济南 天然气 暖气 物业费 水费 电费价格
  8. ZK(1)——分布式系统概念与ZK简介
  9. MineCraft mod开发环境搭建
  10. 爬取徐州市自然资源和规划局土地数据
  11. 2023年2.14情人节最浪漫的表白烟花,送给自己的脑婆(源码)
  12. 【C++入门】静态成员详解(定义、实现原理、使用注意事项)
  13. 计算机故障声音,不同的电脑故障声音分别是什么意思【详解】
  14. 巧用千寻位置GNSS软件| 点放样操作指南
  15. Google Earth Engine(GEE)——Python干旱严重程度案例分析
  16. spring的 init-method和 destory-method方法
  17. MySQL(一): 初涉MySQL
  18. CSDN 如何修改用户名(CSDN ID)?
  19. 基于ROS2开发的点云体素化
  20. npm介绍与cnpm介绍

热门文章

  1. drupal主题化常用函数集锦
  2. 侯捷老师-01面向对象高级编程
  3. 计算机二级ms office英语翻译,2015年计算机二级MS Office习题及答案解析(3)
  4. 夏柔免费API管理系统
  5. pdf文件在pdfbox中对应的数据结构的一点浅见
  6. httpclient+testng接口自动化框架二次封装Java
  7. 微信打开网站被提示已停止访问该网页该怎么解决
  8. 【几维安全】安卓加固,Android加固,Android代码混淆,云平台在线使用说明
  9. mysql的定点数_MySQL浮点数和定点数
  10. linux下maven配置