在Koa.js中實(shí)現(xiàn)文件上傳的接口功能
文件上傳是一個(gè)基本的功能,每個(gè)系統(tǒng)幾乎都會(huì)有,比如上傳圖片、上傳Excel等。 那么在Node Koa應(yīng)用中如何實(shí)現(xiàn)一個(gè)支持文件上傳的接口呢? 本文從環(huán)境準(zhǔn)備開(kāi)始、最后分別用 Postman 和一個(gè)HTML頁(yè)面來(lái)測(cè)試。
01—環(huán)境準(zhǔn)備
首先當(dāng)然是要初始化一個(gè)Koa項(xiàng)目了,安裝 Koa、koa-router 即可。
npm install koa koa-router
設(shè)置圖片上傳目錄,把圖片上傳到指定的目錄中,在 app 路徑下新建 public 文件夾,目錄結(jié)構(gòu)如下:
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('啟動(dòng)成功') console.log('http://localhost:3000') });
然后啟動(dòng),確保這一步?jīng)]有問(wèn)題。
02—使用 koa-body 中間件獲取上傳的文件
koa-body 支持文件、json、form格式的請(qǐng)求體,安裝 koa-body
npm install koa-body
設(shè)置 koaBody 配置參數(shù),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'), // 保留文件擴(kuò)展名 keepExtensions: true, } }));
... ...
接下來(lái)完善 /upload 路由,獲取文件,然后直接返回文件路徑
router.post('/upload', ctx => { const file = ctx.request.files.file ctx.body = { path: file.path } })
這樣我們其實(shí)已經(jīng)可以進(jìn)行文件上傳,并把文件上傳到 public/uploads 中了,我們用 Postman 來(lái)測(cè)試一下。
打開(kāi) Postman,輸入 http://localhost:3001/upload ,選擇 POST 方法,并且選擇文件用 Body 來(lái)傳輸,并且選擇 form-data 格式,然后在 KEY 中選擇 file類型。
然后就可以選擇圖片進(jìn)行上傳了,上傳成功后就可以看到 uploads 文件夾下有一個(gè)圖片了,并且輸出了圖片的路徑。
03—使用 koa-static 中間件生成圖片鏈接
直接返回圖片的本地路徑在實(shí)際上是沒(méi)什么用的,我們應(yīng)該返回一個(gè)http鏈接的圖片地址,點(diǎn)擊地址就可以查看圖片。
借助 koa-static 中間件可以幫助我們生成一個(gè)靜態(tài)服務(wù),它指定一個(gè)文件夾,文件夾下所有的文件都可以通過(guò) http服務(wù)來(lái)訪問(wèn)。
安裝: npm install koa-static
并注冊(cè)到 app 上,我們把他注冊(cè)在 koaBody 中間件的前面,把 public 設(shè)置為靜態(tài)文件目錄。
const koaStatic = require('koa-static') ... ... app.use(koaStatic(path.join(__dirname, 'public')))
啟動(dòng)程序,這樣 public 下的文件就可以使用HTTP服務(wù)來(lái)打開(kāi)了,我們可以打開(kāi)之前上傳的圖片: http://localhost:3001/uploads/upload_65c1d26e5a47870cf4011aad1243fce0.png ,可以在瀏覽器中直接顯示了。
然后我們改造一下 upload 路由的實(shí)現(xiàn),讓它生成圖片鏈接返回給客戶端
router.post('/upload', ctx => { const file = ctx.request.files.file const basename = path.basename(file.path) ctx.body = { "url": `${ctx.origin}/uploads/${basename}` } })
basename 可以拿到文件的文件名和擴(kuò)展名,ctx.origin 拿到服務(wù)器的域名,即諸如 localhost:3001,但我們不能寫死。
再用 Postman 測(cè)試一下,即可看到返回的 圖片URL了,點(diǎn)擊可以直接打開(kāi)。
04—編寫前端頁(yè)面上傳文件
前面我們用 Postman 模擬了上傳文件進(jìn)行測(cè)試,雖然可以高效的測(cè)試我們編寫的后端接口,但是我們前端有些同學(xué)可能通常更熟悉前端頁(yè)面的方式測(cè)試,那么我們來(lái)寫一個(gè)表單頁(yè)面來(lái)測(cè)試。
在 public 中新建 upload.html 文件作為測(cè)試頁(yè)面。
<form action="/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">上傳</button> </form>
這是傳統(tǒng)的表單提交,我們實(shí)際工作中這樣的代碼可能已經(jīng)不常見(jiàn)了,action 就是我們的提交到的接口,enctype="multipart/form-data"
就是指定上傳文件格式。 input 的 name 屬性一定要等于file,因?yàn)槲覀兘邮艿淖侄蚊?file。
然后我們用HTTP服務(wù)打開(kāi)這個(gè)頁(yè)面: http://localhost:3001/upload.html ,因?yàn)槲覀冋麄€(gè) public 目錄已經(jīng)是一個(gè)靜態(tài)HTTP服務(wù)目錄了,里面的所有文件都可以通過(guò)HTTP訪問(wèn)。
選擇文件,點(diǎn)擊上傳,上傳成功后可以看到返回了文件地址
總結(jié)
以上所述是小編給大家介紹的在Koa.js中實(shí)現(xiàn)文件上傳的接口功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- 詳解使用jest對(duì)vue項(xiàng)目進(jìn)行單元測(cè)試
- SpringBoot 整合Jest實(shí)例代碼講解
- 基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計(jì)示例
- 詳解如何在項(xiàng)目中使用jest測(cè)試react native組件
- 詳解Jest結(jié)合Vue-test-utils使用的初步實(shí)踐
- Javascript ParentNode和ChildNode接口原理解析
- vue-resource:jsonp請(qǐng)求百度搜索的接口示例
- JS 封裝父頁(yè)面子頁(yè)面交互接口的實(shí)例代碼
- 用js簡(jiǎn)單提供增刪改查接口
- 詳解Nodejs get獲取遠(yuǎn)程服務(wù)器接口數(shù)據(jù)
- 使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測(cè)試實(shí)例詳解
相關(guān)文章
JS在可編輯的div中的光標(biāo)位置插入內(nèi)容的方法
這篇文章主要介紹了JS在可編輯的div中的光標(biāo)位置插入內(nèi)容的方法,分別用js與jQuery兩種方式加以實(shí)現(xiàn),是非常實(shí)用的特效技巧,需要的朋友可以參考下2014-11-112016年最熱門的15 款代碼語(yǔ)法高亮工具,美化你的代碼
無(wú)論是代碼高亮還是語(yǔ)法高亮對(duì)整個(gè)程序來(lái)說(shuō)都非常重要,可以給人眼前一亮的感覺(jué),增加用戶體驗(yàn)度,下面通過(guò)本文給大家介紹2016年最熱門的Javascript代碼高亮顯示腳本及代碼語(yǔ)法高亮工具,對(duì)js代碼高亮,代碼語(yǔ)法高亮相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01JS設(shè)置cookie、讀取cookie、刪除cookie
Js操作Cookie總結(jié)(設(shè)置,讀取,刪除),工作中經(jīng)常會(huì)用到的哦!下面是詳細(xì)代碼,如有錯(cuò)誤,請(qǐng)留言指正!2015-04-04如何寫一個(gè)通用的JavaScript效果庫(kù)!(2/2)
如何寫一個(gè)通用的JavaScript效果庫(kù)!(2/2)...2007-04-04微信小程序跳轉(zhuǎn)外部鏈接的詳細(xì)實(shí)現(xiàn)方法
寫這個(gè)是因?yàn)樽罱〕绦虻囊粋€(gè)需求需要從小程序跳轉(zhuǎn)到客戶的官網(wǎng),或者其他外部報(bào)名鏈接,下面這篇文章主要給大家介紹了關(guān)于微信小程序跳轉(zhuǎn)外部鏈接的詳細(xì)實(shí)現(xiàn)方法,需要的朋友可以參考下2022-10-10Swiper 4.x 使用方法(移動(dòng)端網(wǎng)站的內(nèi)容觸摸滑動(dòng))
Swiper是純javascript打造的滑動(dòng)特效插件,面向手機(jī)、平板電腦等移動(dòng)終端,這里為大家簡(jiǎn)單介紹一下Swiper4的用法,需要的朋友可以參考下2018-05-05