在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 相关文章推荐
js字符编码函数区别分析
Jun 05 Javascript
js 深拷贝函数
Dec 04 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
Apr 02 Javascript
javascript实现促销倒计时+fixed固定在底部
Sep 18 Javascript
jquery ajax 局部无刷新更新数据的实现案例
Feb 08 Javascript
Html5的placeholder属性(IE兼容)实现代码
Aug 30 Javascript
JS中sort函数排序用法实例分析
Jun 16 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
bootstrap基本配置_动力节点Java学院整理
Jul 14 Javascript
React路由管理之React Router总结
May 10 Javascript
js实现无限瀑布流实例方法
Sep 16 Javascript
Javascript实现关闭广告效果
Jan 29 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
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
JavaScript 自定义事件之我见
2017/09/25 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python中pygame模块用法实例
2014/10/09 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
法国在线药房:DoctiPharma
2020/10/21 全球购物
接口可以包含哪些成员
2012/09/30 面试题
路政管理毕业自荐书范文
2014/02/10 职场文书
运动会广播稿20字
2014/02/18 职场文书
共产党员公开承诺书
2014/03/25 职场文书
领导班子四风表现材料
2014/08/23 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python