精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Koa2 之文件上傳下載

開發(fā) 開發(fā)工具
在前端中上傳文件,我們都是通過表單來上傳,而上傳的文件,在服務(wù)器端并不能像普通參數(shù)一樣通過 ctx.request.body 獲取。我們可以用 koa-body 中間件來處理文件上傳,它可以將請求體拼到 ctx.request 中。

上傳下載在 web 應(yīng)用中還是比較常見的,無論是圖片還是其他文件等。在 Koa 中,有很多中間件可以幫助我們快速的實(shí)現(xiàn)功能。

[[226694]]

文件上傳

在前端中上傳文件,我們都是通過表單來上傳,而上傳的文件,在服務(wù)器端并不能像普通參數(shù)一樣通過 ctx.request.body 獲取。我們可以用 koa-body 中間件來處理文件上傳,它可以將請求體拼到 ctx.request 中。

  1. // app.js 
  2. const koa = require('koa'); 
  3. const app = new koa(); 
  4. const koaBody = require('koa-body'); 
  5. app.use(koaBody({ 
  6.     multipart: true
  7.     formidable: { 
  8.         maxFileSize: 200*1024*1024  // 設(shè)置上傳文件大小***限制,默認(rèn)2M 
  9.     } 
  10. })); 
  11. app.listen(3001, ()=>{ 
  12.     console.log('koa is listening in 3001'); 
  13. }) 

使用中間件后,就可以在 ctx.request.body.files 中獲取上傳的文件內(nèi)容。需要注意的就是設(shè)置 maxFileSize,不然上傳文件一超過默認(rèn)限制就會報(bào)錯。

接收到文件之后,我們需要把文件保存到目錄中,返回一個 url 給前端。在 node 中的流程為

  1. 創(chuàng)建可讀流 const reader = fs.createReadStream(file.path)
  2. 創(chuàng)建可寫流 const writer = fs.createWriteStream('upload/newpath.txt')
  3. 可讀流通過管道寫入可寫流 reader.pipe(writer)
  1. const router = require('koa-router')(); 
  2. const fs = require('fs'); 
  3. router.post('/upload', async (ctx){ 
  4.     const file = ctx.request.body.files.file;   // 獲取上傳文件 
  5.     const reader = fs.createReadStream(file.path);  // 創(chuàng)建可讀流 
  6.     const ext = file.name.split('.').pop();     // 獲取上傳文件擴(kuò)展名 
  7.     const upStream = fs.createWriteStream(`upload/${Math.random().toString()}.${ext}`);     // 創(chuàng)建可寫流 
  8.     reader.pipe(upStream);  // 可讀流通過管道寫入可寫流 
  9.     return ctx.body = '上傳成功'
  10. }) 

該方法適用于上傳圖片、文本文件、壓縮文件等。

文件下載

koa-send 是一個靜態(tài)文件服務(wù)的中間件,可用來實(shí)現(xiàn)文件下載功能。

  1. const router = require('koa-router')(); 
  2. const send = require('koa-send'); 
  3. router.post('/download/:name', async (ctx){ 
  4.     const name = ctx.params.name
  5.     const path = `upload/${name}`; 
  6.     ctx.attachment(path); 
  7.     await send(ctx, path); 
  8. }) 

在前端進(jìn)行下載,有兩個方法: window.open 和表單提交。這里使用簡單一點(diǎn)的 window.open。

  1. <button onclick="handleClick()">立即下載</button> 
  2. <script> 
  3.     const handleClick = () => { 
  4.         window.open('/download/1.png'); 
  5.     } 
  6. </script> 

這里 window.open 默認(rèn)是開啟一個新的窗口,一閃然后關(guān)閉,給用戶的體驗(yàn)并不好,可以加上第二個參數(shù) window.open('/download/1.png', '_self');,這樣就會在當(dāng)前窗口直接下載了。然而這樣是將 url 替換當(dāng)前的頁面,則會觸發(fā) beforeunload 等頁面事件,如果你的頁面監(jiān)聽了該事件做一些操作的話,那就有影響了。那么還可以使用一個隱藏的 iframe 窗口來達(dá)到同樣的效果。

  1. <button onclick="handleClick()">立即下載</button> 
  2. <iframe name="myIframe" style="display:none"></iframe> 
  3. <script> 
  4.     const handleClick = () => { 
  5.         window.open('/download/1.png''myIframe'); 
  6.     } 
  7. </script> 

批量下載

批量下載和單個下載也沒什么區(qū)別嘛,就多執(zhí)行幾次下載而已嘛。這樣也確實(shí)沒什么問題。如果把這么多個文件打包成一個壓縮包,再只下載這個壓縮包,是不是體驗(yàn)起來就好一點(diǎn)了呢。

文件打包

archiver 是一個在 Node.js 中能跨平臺實(shí)現(xiàn)打包功能的模塊,支持 zip 和 tar 格式。

  1. const router = require('koa-router')(); 
  2. const send = require('koa-send'); 
  3. const archiver = require('archiver'); 
  4. router.post('/downloadAll', async (ctx){ 
  5.     // 將要打包的文件列表 
  6.     const list = [{name'1.txt'},{name'2.txt'}]; 
  7.     const zipName = '1.zip'
  8.     const zipStream = fs.createWriteStream(zipName); 
  9.     const zip = archiver('zip'); 
  10.     zip.pipe(zipStream); 
  11.     for (let i = 0; i < list.length; i++) { 
  12.         // 添加單個文件到壓縮包 
  13.         zip.append(fs.createReadStream(list[i].name), { name: list[i].name }) 
  14.     } 
  15.     await zip.finalize(); 
  16.     ctx.attachment(zipName); 
  17.     await send(ctx, zipName); 
  18. }) 

如果直接打包整個文件夾,則不需要去遍歷每個文件 append 到壓縮包里

  1. const zipStream = fs.createWriteStream('1.zip'); 
  2. const zip = archiver('zip'); 
  3. zip.pipe(zipStream); 
  4. // 添加整個文件夾到壓縮包 
  5. zip.directory('upload/'); 
  6. zip.finalize(); 

注意:打包整個文件夾,生成的壓縮包文件不可存放到該文件夾下,否則會不斷的打包。

中文編碼問題

當(dāng)文件名含有中文的時候,可能會出現(xiàn)一些預(yù)想不到的情況。所以上傳時,含有中文的話我會對文件名進(jìn)行 encodeURI() 編碼進(jìn)行保存,下載的時候再進(jìn)行 decodeURI() 解密。

  1. ctx.attachment(decodeURI(path)); 
  2. await send(ctx, path); 

ctx.attachment 將 Content-Disposition 設(shè)置為 “附件” 以指示客戶端提示下載。通過解碼后的文件名作為下載文件的名字進(jìn)行下載,這樣下載到本地,顯示的還是中文名。

然鵝,koa-send 的源碼中,會對文件路徑進(jìn)行 decodeURIComponent() 解碼:

  1. // koa-send 
  2. path = decode(path) 
  3. function decode (path) { 
  4.   try { 
  5.     return decodeURIComponent(path) 
  6.   } catch (err) { 
  7.     return -1 
  8.   } 

這時解碼后去下載含中文的路徑,而我們服務(wù)器中存放的是編碼后的路徑,自然就找不到對應(yīng)的文件了。

要想解決這個問題,那么就別讓它去解碼。不想動 koa-send 源碼的話,可使用另一個中間件 koa-sendfile 代替它。

  1. const router = require('koa-router')(); 
  2. const sendfile = require('koa-sendfile'); 
  3. router.post('/download/:name', async (ctx){ 
  4.     const name = ctx.params.name
  5.     const path = `upload/${name}`; 
  6.     ctx.attachment(decodeURI(path)); 
  7.     await sendfile(ctx, path); 
  8. }) 

【本文為51CTO專欄作者“林鑫”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2009-07-07 13:45:04

jspsmart

2009-07-03 14:15:54

JSP SmartUp

2015-02-11 16:34:49

微信SDK

2009-07-30 13:43:58

ASP.NET中文件上

2011-02-21 18:11:27

vsFTPd

2009-09-01 16:49:56

C#文件上傳下載

2023-09-06 08:33:30

2021-06-04 13:07:53

LinuxPythonXshell

2010-03-08 11:34:45

Linux上傳下載指令

2009-07-02 13:31:13

JSP組件

2023-01-13 09:37:23

2016-10-31 14:16:33

node前后端分離koa

2018-08-23 16:18:59

2010-01-14 15:06:27

CentOS用戶

2017-06-20 15:39:58

Koa2 應(yīng)用動態(tài)Swagger文檔

2022-01-26 07:53:07

koa2后端服務(wù)器

2023-05-07 07:45:31

2013-09-04 10:20:31

遠(yuǎn)程控制軟

2009-05-25 09:57:10

Ajax文件管理Web開發(fā)

2009-12-28 14:05:21

光纖接入網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

中文字幕中文在线| 国产成人av网址| 中文字幕资源在线观看| 国产露出视频在线观看| 欧美午夜不卡| 日韩欧美电影一区| 草草视频在线免费观看| 国产 日韩 欧美 综合| 欧美日韩1080p| 精品久久免费看| 久久久久久久9| 天天操天天射天天| 久久高清一区| 尤物精品国产第一福利三区| 中文字幕第88页| 欧美一区二区三区四区在线观看地址 | av一区二区三区免费观看| jizz中国少妇| 亚洲自拍另类| 日韩在线播放视频| 亚洲高清无码久久| 欧美成人毛片| 午夜精品影院在线观看| 一区二区高清视频| 无码精品在线观看| 激情成人综合网| 国产91精品久久久久久久| 网站永久看片免费| 欧美wwwwww| 3atv一区二区三区| 免费激情视频在线观看| 欧美黑人猛交| 久久久久久毛片| 超碰97在线资源| 中文字幕在线观看第二页| 亚洲欧洲另类| 久久6精品影院| 亚洲不卡的av| 中文字幕精品影院| 欧美大片拔萝卜| 第四色婷婷基地| 超碰超碰人人人人精品| 亚洲一二三四区| 一本—道久久a久久精品蜜桃| 你懂的在线网址| 成人av电影在线观看| 91九色蝌蚪国产| 少妇一级淫片日本| 奶水喷射视频一区| 91精品国产91| 黄色小视频在线免费看| 中文字幕一区二区av| 一区二区三区四区视频| 自拍偷拍中文字幕| 日韩精品导航| 日韩免费高清av| 三级网站免费看| 欧美在线一级| 欧美日韩极品在线观看一区| 妺妺窝人体色www在线观看| 男女羞羞在线观看| 99欧美精品| 成人亚洲精品久久久久软件| 亚洲一区二区三区在线视频| 在线观看不卡的av| 美女网站一区二区| 国产精品精品久久久| 国产真人无遮挡作爱免费视频| 国产欧美丝祙| 欧美在线视频一区二区| 亚洲欧美在线视频免费| 亚洲精品欧洲| 午夜精品理论片| 天天操天天爽天天干| 国产欧美欧美| 国产成人激情视频| 中文字幕一区2区3区| 蜜桃久久精品一区二区| 成人免费xxxxx在线观看| 麻豆精品久久久久久久99蜜桃| 亚洲欧美成人综合| 国产精国产精品| 中文字幕在线观看欧美| 国内成+人亚洲+欧美+综合在线 | 影音先锋欧美资源| 中文字幕在线观看播放| 亚洲午夜久久久久中文字幕久| 成人免费看片'免费看| 成人影院在线播放| 日韩欧美高清在线视频| 九热视频在线观看| 成人综合日日夜夜| 亚洲第一福利视频| 在线小视频你懂的| 一本精品一区二区三区| 欧美激情一二区| 欧美性猛交bbbbb精品| 青青草伊人久久| 亚洲a级在线观看| 免费av网站观看| 国产午夜精品福利| 国产成年人在线观看| 日本在线视频中文有码| 精品福利樱桃av导航| 爱情岛论坛亚洲首页入口章节| 九七电影院97理论片久久tvb| 欧美一二三区在线观看| 欧美特黄一区二区三区| 日韩免费av| 欧美国产在线视频| 在线观看亚洲黄色| 国产成人99久久亚洲综合精品| 久久艳妇乳肉豪妇荡乳av| 午夜老司机在线观看| 亚洲小说欧美激情另类| 少妇性l交大片| 一区二区精彩视频| 国产亚洲精品久久久久久| 91视频综合网| 久久成人精品| 成人在线观看91| eeuss影院www在线播放| 亚洲国产va精品久久久不卡综合| 美女网站免费观看视频| 波多野结衣一区二区三区免费视频| 亚洲欧美资源在线| 欧美日韩国产精品综合| 日韩av电影天堂| 国产一区二区久久久| 91在线观看| 福利视频导航一区| 中文字幕久久久久久久| 日本道不卡免费一区| 91av免费观看91av精品在线| av观看在线免费| 国产欧美日韩在线视频| 免费国产a级片| 欧美成人精品一级| 久久国内精品一国内精品| 久久久久久无码精品大片| 不卡电影一区二区三区| 男女裸体影院高潮| 自拍偷拍欧美日韩| 色偷偷偷综合中文字幕;dd| 国产午夜性春猛交ⅹxxx| 成人一区二区三区中文字幕| 福利网在线观看| 亚洲精品自拍| 色悠悠久久久久| 成人黄色三级视频| 久久久精品蜜桃| 国产a级一级片| 欧美三级午夜理伦三级在线观看| 欧美福利在线观看| 性生活黄色大片| 一区二区三区av电影| 亚洲国产日韩在线一区| 天天射成人网| 91麻豆国产语对白在线观看| 麻豆免费在线观看| 7777精品久久久大香线蕉| 美国精品一区二区| 蜜桃一区二区三区在线| 在线观看一区欧美| 中文字幕日本一区| 欧美成人午夜激情在线| 亚洲成人久久精品| 亚洲一区二区三区中文字幕| 欧美一级片在线免费观看| 国内精品美女在线观看| 成人av电影免费| 电影k8一区二区三区久久| 亚洲国产精品久久精品怡红院| 国产91av视频| 91一区二区在线| 免费日韩视频在线观看| 成人在线国产| 91九色国产社区在线观看| 天堂av最新在线| 亚洲第一综合天堂另类专| 国产微拍精品一区| 国产亚洲精品超碰| 久久久精品高清| 黄色在线成人| 欧美理论一区二区| 国产精品天堂蜜av在线播放| 日韩中文在线中文网三级| 国产成人精品一区二三区四区五区 | 国产亚洲电影| 成人在线中文字幕| 人人澡人人添人人爽一区二区| 精品国一区二区三区| 欧美精品韩国精品| 亚洲色图在线播放| 少妇精品无码一区二区三区| 日韩在线一区二区三区| 国产精品久久成人免费观看| 国内精品麻豆美女在线播放视频| 欧美资源在线观看| 菠萝蜜视频国产在线播放| 亚洲精品成a人在线观看| 丰满熟女人妻一区二区三| 亚洲欧美另类小说| 女尊高h男高潮呻吟| 国内成人自拍视频| 国产成人久久777777| 婷婷色综合网| 久久久久久久久一区| 高清不卡一区| 日韩av日韩在线观看| 91cn在线观看| 国产一区二区三区视频免费| 亚洲狼人综合网| 欧美日韩黄视频| www.伊人久久| 亚洲在线观看免费| 网爆门在线观看| 91视视频在线观看入口直接观看www | 一级片一区二区三区| 五月激情综合色| 天天鲁一鲁摸一摸爽一爽| 久久精品一区二区三区不卡牛牛| www日本在线观看| 久久99久国产精品黄毛片色诱| 国产精品无码人妻一区二区在线| 天天操夜夜操国产精品| 欧美精品一区二区三区四区五区| 亚洲2区在线| 国产中文字幕亚洲| 久久精品女人天堂av免费观看| 久久久久久国产三级电影| 免费日本一区二区三区视频| 国产一区二区三区18| 香蕉视频国产在线| 精品处破学生在线二十三| 99re只有精品| 欧美日韩一区小说| 国产字幕在线观看| 精品久久中文字幕| 国产一国产二国产三| 一区二区三区在线免费| 91高清免费看| 中文字幕视频一区| 人人干在线观看| 中文字幕av资源一区| 干b视频在线观看| 久久久亚洲国产美女国产盗摄| 精品一区二区三区四区五区六区| 国模大尺度一区二区三区| 一起操在线视频| 日本欧美大码aⅴ在线播放| 热久久精品国产| 久久九九国产| 精品视频无码一区二区三区| 先锋影音国产一区| 欧美视频第一区| 久久久久久婷| 午夜免费精品视频| 青青草国产精品97视觉盛宴| 黄色三级视频片| 日日摸夜夜添夜夜添国产精品 | 狠狠色综合网站久久久久久久| 91成人福利| 精品视频一区二区| 女优一区二区三区| 日韩精品资源| 久久国产电影| 国产欧美自拍视频| 国内自拍视频一区二区三区| 欧美视频在线第一页| 一区二区视频欧美| 欧洲黄色一级视频| 日韩高清不卡在线| 亚洲小视频网站| 国产乱人伦偷精品视频免下载| 巨乳女教师的诱惑| 北条麻妃国产九九精品视频| 精品人妻无码一区二区三区| 亚洲国产成人一区二区三区| 黄色录像免费观看| 亚洲国产精品久久人人爱| 国内自拍视频在线播放| 欧美无砖砖区免费| 99视频免费看| 日韩av在线导航| 高清中文字幕一区二区三区| www.日韩不卡电影av| 麻豆蜜桃在线| 国产va免费精品高清在线观看| 成人四虎影院| 成人91免费视频| 国产永久精品大片wwwapp| 亚洲一区精品视频| 亚洲大片在线| 亚洲欧美在线精品| 国产a区久久久| 熟女俱乐部一区二区| 亚洲欧美日韩小说| 日本天堂网在线| 欧美一区二区在线看| 亚洲人成色777777精品音频| 色多多国产成人永久免费网站 | 91蜜桃在线观看| 九九这里只有精品视频| 午夜伊人狠狠久久| 一级全黄少妇性色生活片| 精品欧美一区二区在线观看| 噜噜噜在线观看播放视频| 日韩最新中文字幕电影免费看| 大黄网站在线观看| 91精品国产综合久久香蕉的用户体验| 加勒比久久高清| 日韩在线导航| 亚洲青色在线| 五月天开心婷婷| 久久久高清一区二区三区| 欧美成人精品欧美一级私黄| 在线精品国精品国产尤物884a| 国产黄色小视频在线观看| 亚洲欧美色婷婷| 国产www视频在线观看| 国产欧美精品一区二区三区-老狼| 999精品视频在这里| 视频一区二区三区免费观看| 亚洲小说欧美另类婷婷| 看看黄色一级片| 久久久久久久久久久99999| 久视频在线观看| 91精品国产色综合久久ai换脸| 成年网站在线| 欧美专区在线播放| 国偷自产av一区二区三区| 欧美少妇一级片| 免费看日韩精品| 人人妻人人藻人人爽欧美一区| 亚洲国产中文字幕在线视频综合| 国产精品午夜福利| 色琪琪综合男人的天堂aⅴ视频| 日韩电影免费观看高清完整版| 国产精品免费一区二区三区观看 | 伊人伊成久久人综合网小说| 麻豆免费版在线观看| 国产精品一 二 三| 国产精品多人| 一级黄色大片免费看| 亚洲黄色av一区| a级片在线播放| 久热爱精品视频线路一| 欧美综合影院| 一区二区三区不卡在线| 美女免费视频一区| 99自拍偷拍视频| 欧美乱妇23p| 毛片在线视频| 91久久嫩草影院一区二区| 久久久久av| 欧美激情国内自拍| 亚洲女与黑人做爰| av网站免费播放| 欧美大荫蒂xxx| 91国内精品| 美女日批免费视频| 91丨九色porny丨蝌蚪| 中文字幕xxxx| 神马国产精品影院av| 婷婷成人av| 中文精品无码中文字幕无码专区| 国产成人精品三级麻豆| 精品处破女学生| 亚洲国产欧美自拍| 成人免费无遮挡| 视频在线精品一区| 久久99在线观看| 国产极品国产极品| 精品国产成人在线影院 | 国产一区日韩| 三上悠亚av一区二区三区| 亚洲男人天堂一区| 日韩在线观看视频一区| 日本不卡免费高清视频| 日韩精品诱惑一区?区三区| 欧美国产在线一区| 欧美日韩国产在线| av网站在线免费播放| 51成人做爰www免费看网站| 亚洲精选在线| 亚洲高潮女人毛茸茸| 日韩午夜激情电影| 在线免费三级电影网站| 亚洲在线色站| 不卡视频一二三四| 中文字幕资源网| 欧美激情欧美激情在线五月| 亚洲免费福利一区| 国内av一区二区| 欧美日韩加勒比精品一区| 日本在线视频网| 精品乱子伦一区二区三区| 蜜臀av性久久久久av蜜臀妖精 | 91精品一区国产高清在线gif|