最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Node.js實現(xiàn)HTTP文件下載

 更新時間:2016年08月05日 16:59:05   投稿:daisy  
本文介紹如何用Node.js來實現(xiàn)HTTP文件下載,文章以實例演示所以很詳細(xì),有需要的小伙伴們可以參考學(xué)習(xí)。

前言

HTTP實現(xiàn)文件下載時,只要在服務(wù)器設(shè)置好相關(guān)響應(yīng)頭,并使用二進(jìn)制傳輸文件數(shù)據(jù)即可,而客戶端(瀏覽器)會根據(jù)響應(yīng)頭接收文件數(shù)據(jù)。而在Node.js中,設(shè)置好響應(yīng)頭后,讀取文件流,再使用“.pipe()”方法將流轉(zhuǎn)接到響應(yīng)對象Response就可以實現(xiàn)一個簡單的文件下載服務(wù)器。

1. 文件下載介紹

HTTP基于請求頭和響應(yīng)頭實現(xiàn)狀態(tài)交互,在得到服務(wù)器正確響應(yīng)狀態(tài)后,而客戶端首先會解析響應(yīng)頭,并根據(jù)響應(yīng)頭來接收和展示數(shù)據(jù)(響應(yīng)體)。對于文件下載來說,其實現(xiàn)過程如下:

    1.客戶端發(fā)起文件資源請求

    2.服務(wù)器查找對應(yīng)文件,并設(shè)置”Content-Type”、”Content-Disposition”等響應(yīng)頭,分別用于表示文件的”MIME”類型及文件描述

    3.客戶端根據(jù)服務(wù)器返回的響應(yīng)頭解析和接收文件數(shù)據(jù)

需要設(shè)置的響應(yīng)頭

設(shè)置文件下載響應(yīng)頭時,除了常用的HTTP響應(yīng)頭外,比較重要是還要設(shè)置以下兩個響應(yīng)頭:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename=MyFileName.ext

在上面的設(shè)置中,”Content-Type: application/octet-stream”告訴瀏覽器這是一個二進(jìn)制文件,”Content-Disposition”告訴瀏覽器這是一個需要下載的附件并告訴瀏覽器默認(rèn)的文件名。如果不添加”Content-Disposition”響應(yīng)頭,瀏覽器可能會下載或顯示文件內(nèi)容,不同瀏覽器的處理有所不同。

2. Node.js文件下載服務(wù)器實現(xiàn)

接下來我們基于Express 框架實現(xiàn)一個簡單文件下載服務(wù)器,在這個服務(wù)器中主要包括兩個功能:服務(wù)器文件的瀏覽文件的下載。

2.1 添加路由

創(chuàng)建Express應(yīng)用后,添加如下兩個路由:

router.get('/files', function(req, res, next) {
 // 顯示服務(wù)器文件 
});
router.get('/file/:fileName', function(req, res, next) {
 // 實現(xiàn)文件下載 
});

上面的添加的兩個路由分別用于:顯示服務(wù)器文件、實現(xiàn)文件下載。

2.2 顯示服務(wù)器文件

實現(xiàn)服務(wù)器文件的顯示,要通過”fs”模塊讀取文件目錄并進(jìn)行文件/目錄檢查等。還需要使用”path”模塊處理文件路徑。首先引入這兩個模塊:

const fs = require('fs');
const path = require('path');

顯示服務(wù)器文件實現(xiàn)代碼如下:

router.get('/files', function(req, res, next) {
 // 顯示服務(wù)器文件 
 // 文件目錄
 var filePath = path.join(__dirname, './');
 fs.readdir(filePath, function(err, results){
  if(err) throw err;
  if(results.length>0) {
   var files = [];
   results.forEach(function(file){
   if(fs.statSync(path.join(filePath, file)).isFile()){
     files.push(file);
   }
   })
   res.render('files', {files:files});
  } else {
   res.end('當(dāng)前目錄下沒有文件');
  }
 });
});

上面代碼中,讀取目錄后通過視圖文件”files.ejs”顯示可下載文件列表。其代碼如下:

<!DOCTYPE html>
<html>
 <head>
  <title>下載文件選擇</title>
 </head>
 <body>
  <h1>請選擇下載文件:</h1>
  <% if(files.length>0) {%>
  <ul>
   <% files.forEach(function(file){ %>
   <li>
    <a href="/file/<%- file %>" target="_blank"><%- file %></a>
   </li>
   <%})%>
  </ul>
  <%} else {%>
  <p>沒有可下載文件…</p>
  <%}%>
 </body>
</html>

2.3 實現(xiàn)文件下載

實現(xiàn)文件下載時,可以先讀取文件到一個”Buffer”中,再通過”res.send()”或”res.end()”方法發(fā)送文件數(shù)據(jù),也可以基于流(”Stream”)實現(xiàn)文件數(shù)據(jù)的發(fā)送。使用”Stream”實現(xiàn)文件下載時,可以使用”fs.createReadStream()”方法創(chuàng)建一個可讀流,而響應(yīng)對象Response是一個可寫流。這樣,只需要通過”.pipe()”方法將文件流轉(zhuǎn)接到Response響應(yīng)流中即可。

文件下載實現(xiàn)代碼如下:

router.get('/file/:fileName', function(req, res, next) {
 // 實現(xiàn)文件下載 
 var fileName = req.params.fileName;
 var filePath = path.join(__dirname, fileName);
 var stats = fs.statSync(filePath); 
 if(stats.isFile()){
  res.set({
   'Content-Type': 'application/octet-stream',
   'Content-Disposition': 'attachment; filename='+fileName,
   'Content-Length': stats.size
  });
  fs.createReadStream(filePath).pipe(res);
 } else {
  res.end(404);
 }
});

總結(jié)

以上就是利用Node.js實現(xiàn)HTTP文件下載的全部內(nèi)容,希望對大家學(xué)習(xí)Node.js有所幫助。

相關(guān)文章

  • node.js中的dns.getServers方法使用說明

    node.js中的dns.getServers方法使用說明

    這篇文章主要介紹了node.js中的dns.getServers方法使用說明,本文介紹了dns.getServers方法說明、語法和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解一些適用于Node.js的命名約定

    詳解一些適用于Node.js的命名約定

    這篇文章主要介紹了詳解一些適用于Node.js的命名約定,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解node Async/Await 更好的異步編程解決方案

    詳解node Async/Await 更好的異步編程解決方案

    這篇文章主要介紹了詳解Async/Await 更好的異步編程解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問題詳解

    node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問題詳解

    這篇文章主要給大家介紹了關(guān)于node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)把。
    2017-10-10
  • Node.js Sequelize如何實現(xiàn)數(shù)據(jù)庫的讀寫分離

    Node.js Sequelize如何實現(xiàn)數(shù)據(jù)庫的讀寫分離

    Sequelize是一個易于使用,支持多SQL方言(dialect)的對象-關(guān)系映射框架(ORM),這個庫完全采用JavaScript開發(fā)并且能夠用在Node.JS環(huán)境中。它當(dāng)前支持MySQL, MariaDB, SQLite 和 PostgreSQL 數(shù)據(jù)庫。在Node.js中,使用 Sequelize操作數(shù)據(jù)庫時,同樣支持讀寫分離。
    2016-10-10
  • 一步步教你使用node搭建一個小頁面

    一步步教你使用node搭建一個小頁面

    最近使用NodeJs搭建的小型web應(yīng)用,所以下面這篇文章主要給大家介紹了關(guān)于使用node搭建一個小頁面的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • node schedule實現(xiàn)定時任務(wù)的示例代碼

    node schedule實現(xiàn)定時任務(wù)的示例代碼

    實際工作中,可能會遇到定時清除某個文件夾內(nèi)容,本文主要介紹了node schedule實現(xiàn)定時任務(wù)的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • nodejs中實現(xiàn)sleep功能實例

    nodejs中實現(xiàn)sleep功能實例

    這篇文章主要介紹了nodejs中實現(xiàn)sleep功能實例,本文講解了sleep功能的開發(fā)過程和使用效果及性能測試,需要的朋友可以參考下
    2015-03-03
  • Nodejs對postgresql基本操作的封裝方法

    Nodejs對postgresql基本操作的封裝方法

    今天小編就為大家分享一篇Nodejs對postgresql基本操作的封裝方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Nodejs進(jìn)程管理模塊forever詳解

    Nodejs進(jìn)程管理模塊forever詳解

    服務(wù)器管理是系統(tǒng)上線后,必須要面對的問題。最好有一個軟件可以提供整套的服務(wù)器運行解決方案:要求運行穩(wěn)定,支持高并發(fā),啟動/停止命令簡單,支持熱部署,宕機(jī)重啟,監(jiān)控界面和日志,集群環(huán)境。
    2014-06-06

最新評論

太谷县| 甘德县| 禄丰县| 奈曼旗| 枣强县| 阳高县| 奇台县| 台北县| 潞城市| 鲁甸县| 昂仁县| 伊春市| 西贡区| 个旧市| 瑞金市| 丰宁| 黄骅市| 黔江区| 怀宁县| 天祝| 府谷县| 阳西县| 颍上县| 宝鸡市| 鸡西市| 习水县| 宝清县| 蓝山县| 深水埗区| 长沙县| 元氏县| 上犹县| 囊谦县| 乡宁县| 宝丰县| 加查县| 灯塔市| 沐川县| 宜川县| 镇宁| 东辽县|