文件上传是一个基本的功能,几乎每个系统都有,比如上传图片,上传Excel等。那么如何在Koa.js中实现一个支持文件上传的接口节点Koa应用程序?本文从环境准备开始,最后使用Postman和一个HTML页面进行测试。准备环境首先是初始化一个Koa工程,安装Koa和koa-router即可。npminstallkoakoa-router设置图片上传目录,将图片上传到指定目录,并在app路径下新建public文件夹。目录结构如下:koa-upload/--app----public------uploads----index.js--package.jsonwriteindex.jsconstkoa=require('koa')constapp=newkoa()router.post('/upload',ctx=>{ctx.body='koauploaddemo'})app.use(router.routes());app.listen(3000,()=>{console.log('启动成功')console.log('http://localhost:3000')});然后开始,确保这一步没有问题。使用koa-body中间件获取上传文件koa-body支持文件、json、表单请求体,安装koa-bodynpminstallkoa-body设置koaBody配置参数,index.jsconstkoa=require('koa')constkoaBody=require('koa-body')constpath=require('path')constapp=newkoa()app.use(koaBody({//支持文件格式multipart:true,formidable:{//上传目录uploadDir:path.join(__dirname,'public/uploads'),//保留文件扩展名keepExtensions:true,}}));......接下来完善/upload路由,获取文件,然后直接返回文件路径router.post('/upload',ctx=>{constfile=ctx.request.files.filectx.body={path:file.path}})这样我们就可以实际上传文件和将它们上传到public/uploads中,让我们用Postman测试一下。使用Postman测试打开Postman,输入http://localhost:3001/upload,选择POST方式,并用Body选择要传输的文件,并选择form-data格式,然后在KEY中选择文件类型。然后就可以选择一张图片上传,上传成功后,在uploads文件夹中可以看到一张图片,以及输出图片的路径。使用koa-static中间件生成图片链接,直接返回图片本地路径,其实是没有用的。我们应该返回一个http链接的图片地址,点击地址可以查看图片。koa-static中间件可以帮我们生成一个静态服务,它指定一个文件夹,文件夹下的所有文件都可以通过http服务访问。安装:npminstallkoa-static并在app上注册,我们在koaBody中间件前面注册,设置public为静态文件目录。constkoaStatic=require('koa-static')......app.use(koaStatic(path.join(__dirname,'public')))启动程序,让public下的文件可以使用HTTP服务放大打开,我们可以打开之前上传的图片:http://localhost:3001/uploads/upload_65c1d26e5a47870cf4011aad1243fce0.png,可以直接在浏览器中显示。然后我们修改上传路由的实现,让它生成图片链接返回给客户端router.post('/upload',ctx=>{constfile=ctx.request.files.fileconstbasename=path.basename(file.path)ctx.body={"url":`${ctx.origin}/uploads/${basename}`}})basename可以得到文件的文件名和扩展名,ctx.origin可以获取服务器的域名,比如localhost:3001,但是我们不能硬编码。然后用Postman测试一下,可以看到返回的图片网址,点击直接打开。在编写前端页面上传文件之前,我们使用Postman模拟上传文件进行测试。虽然我们写的后台界面可以高效测试,但是我们一些前端同学可能对前端页面测试比较熟悉,所以还是写一个表单页面来测试一下吧。在public中创建一个新的upload.html文件作为测试页面。
