在Koa.js中实现文件上传的接口功能


Posted in Javascript onOctober 08, 2019

文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片、上传Excel等。 那么在Node Koa应用中如何实现一个支持文件上传的接口呢? 本文从环境准备开始、最后分别用 Postman 和一个HTML页面来测试。

01—环境准备

首先当然是要初始化一个Koa项目了,安装 Koa、koa-router 即可。

npm install koa koa-router

设置图片上传目录,把图片上传到指定的目录中,在 app 路径下新建 public 文件夹,目录结构如下:

koa-upload/

--app

----public

------uploads

----index.js

--package.json

编写 index.js

const koa = require('koa')
const app = new koa()
router.post('/upload', ctx => {
  ctx.body = 'koa upload demo'
})
app.use(router.routes());
app.listen(3000, () => {
  console.log('启动成功')
  console.log('http://localhost:3000')
});

然后启动,确保这一步没有问题。

02—使用 koa-body 中间件获取上传的文件

koa-body 支持文件、json、form格式的请求体,安装 koa-body

  npm install koa-body

设置 koaBody 配置参数,index.js

const koa = require('koa')
const koaBody = require('koa-body')
const path = require('path')
const app = new koa()
app.use(koaBody({
  // 支持文件格式
  multipart: true,
  formidable: {
    // 上传目录
    uploadDir: path.join(__dirname, 'public/uploads'),
    // 保留文件扩展名
    keepExtensions: true,
  }
}));

... ...

接下来完善 /upload 路由,获取文件,然后直接返回文件路径

router.post('/upload', ctx => {
  const file = ctx.request.files.file
  ctx.body = { path: file.path }
})

这样我们其实已经可以进行文件上传,并把文件上传到 public/uploads 中了,我们用 Postman 来测试一下。

打开 Postman,输入 http://localhost:3001/upload ,选择 POST 方法,并且选择文件用 Body 来传输,并且选择 form-data 格式,然后在 KEY 中选择 file类型。

在Koa.js中实现文件上传的接口功能

然后就可以选择图片进行上传了,上传成功后就可以看到 uploads 文件夹下有一个图片了,并且输出了图片的路径。

03—使用 koa-static 中间件生成图片链接

直接返回图片的本地路径在实际上是没什么用的,我们应该返回一个http链接的图片地址,点击地址就可以查看图片。

借助 koa-static 中间件可以帮助我们生成一个静态服务,它指定一个文件夹,文件夹下所有的文件都可以通过 http服务来访问。

安装: npm install koa-static 并注册到 app 上,我们把他注册在 koaBody 中间件的前面,把 public 设置为静态文件目录。

const koaStatic = require('koa-static')
... ...
app.use(koaStatic(path.join(__dirname, 'public')))

启动程序,这样 public 下的文件就可以使用HTTP服务来打开了,我们可以打开之前上传的图片: http://localhost:3001/uploads/upload_65c1d26e5a47870cf4011aad1243fce0.png ,可以在浏览器中直接显示了。

然后我们改造一下 upload 路由的实现,让它生成图片链接返回给客户端

router.post('/upload', ctx => {
  const file = ctx.request.files.file
  const basename = path.basename(file.path)
  ctx.body = { "url": `${ctx.origin}/uploads/${basename}` }
})

basename 可以拿到文件的文件名和扩展名,ctx.origin 拿到服务器的域名,即诸如 localhost:3001,但我们不能写死。

再用 Postman 测试一下,即可看到返回的 图片URL了,点击可以直接打开。

在Koa.js中实现文件上传的接口功能

04—编写前端页面上传文件

前面我们用 Postman 模拟了上传文件进行测试,虽然可以高效的测试我们编写的后端接口,但是我们前端有些同学可能通常更熟悉前端页面的方式测试,那么我们来写一个表单页面来测试。

在 public 中新建 upload.html 文件作为测试页面。

<form action="/upload" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">上传</button>
</form>

这是传统的表单提交,我们实际工作中这样的代码可能已经不常见了,action 就是我们的提交到的接口,enctype="multipart/form-data" 就是指定上传文件格式。 input 的 name 属性一定要等于file,因为我们接受的字段名是 file。

然后我们用HTTP服务打开这个页面: http://localhost:3001/upload.html ,因为我们整个 public 目录已经是一个静态HTTP服务目录了,里面的所有文件都可以通过HTTP访问。

在Koa.js中实现文件上传的接口功能

选择文件,点击上传,上传成功后可以看到返回了文件地址

在Koa.js中实现文件上传的接口功能

总结

以上所述是小编给大家介绍的在Koa.js中实现文件上传的接口功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery 应用代码 方便的排序功能
Feb 06 Javascript
用JavaScript实现动画效果的方法
Jul 20 Javascript
JS按字节截取字符长度实例
Nov 20 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
Apr 10 Javascript
AngularJS学习笔记之TodoMVC的分析
Feb 22 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
详解js的六大数据类型
Dec 27 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
Sep 13 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
Vue实现导航栏点击当前标签变色功能
Aug 19 Javascript
将RGB值转换为灰度值的简单算法
Oct 09 Javascript
Javascript中的解构赋值语法详解
Apr 02 Javascript
vue-cli和v-charts实现可视化图表过程解析
Oct 08 #Javascript
vue路由传参页面刷新参数丢失问题解决方案
Oct 08 #Javascript
vux-scroller实现移动端上拉加载功能过程解析
Oct 08 #Javascript
深入学习Vue nextTick的用法及原理
Oct 08 #Javascript
jQuery 筛选器简单操作示例
Oct 02 #jQuery
jQuery 查找元素操作实例小结
Oct 02 #jQuery
JavaScript 作用域实例分析
Oct 02 #Javascript
You might like
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
tensorflow的计算图总结
2020/01/12 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
手机被没收检讨书
2014/02/22 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
党校培训学习心得体会
2016/01/06 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS