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

Node.js實現(xiàn)下載文件的兩種實用方式

 更新時間:2022年09月05日 11:08:49   作者:二木成林  
最近優(yōu)化了幾個新人寫出的動態(tài)表格文件下載接口的性能瓶頸,感覺非常有必要總結(jié)一篇文章作為文檔來拋磚引玉,這篇文章主要給大家介紹了關(guān)于Node.js實現(xiàn)下載文件的兩種實用方式,需要的朋友可以參考下

第一種方式:使用原生的http模塊

我們僅需要用到fshttp兩個node.js的原生模塊,不需要安裝第三方模塊,就可以實現(xiàn)文件的下載。代碼如下:

var fs = require('fs');
var http = require("http");

var server = http.createServer();

server.on("request", function (request, response) {
    // 獲取請求URL
    var url = request.url;
    // 如果是下載文件的URL,則判斷進(jìn)行處理
    if (url === '/download/hello.txt') {
        // 提取文件名hello.txt
        var name = url.substring(url.lastIndexOf('/'));
        // 創(chuàng)建可讀流,讀取當(dāng)前項目目錄下的hello.txt文件
        var rs = fs.createReadStream(__dirname + "/" + name);
        // 設(shè)置響應(yīng)請求頭,200表示成功的狀態(tài)碼,headers表示設(shè)置的請求頭
        response.writeHead(200, {
            'Content-Type': 'application/force-download',
            'Content-Disposition': 'attachment; filename=' + name
        });
        // 將可讀流傳給響應(yīng)對象response
        rs.pipe(response);
    }
});

server.listen(8888, function () {
    console.log("服務(wù)器啟動成功,可以通過 http://127.0.0.1:8888 來進(jìn)行訪問");
});

然后可以通過http://127.0.0.1:8888/download/hello.txt下載文件。

第二種方式:使用Express+Axios下載文件

前端通過axios發(fā)送GET或者POST請求來進(jìn)行文件的下載,關(guān)鍵是對響應(yīng)回來的文件數(shù)據(jù)進(jìn)行處理。

index.html:前端頁面,通過點擊按鈕來進(jìn)行下載文件,而請求是通過axios來發(fā)送的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 引入axios.js -->
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<button onclick="downloadFile()">下載</button>
</body>
<script>
    function downloadFile() {
        axios({
            url: '/file/download',
            method: 'POST',
            responseType: 'blob'
        }).then(function (response) {
            // 將響應(yīng)回來的數(shù)據(jù)下載為文件,固定代碼
            // 將響應(yīng)數(shù)據(jù)處理為Blob類型
            var blob = new Blob([response.data]);
            // 創(chuàng)建一個URL對象
            var url = window.URL.createObjectURL(blob);
            // 創(chuàng)建一個a標(biāo)簽
            var a = document.createElement("a");
            a.href = url;
            a.download = "hello.txt";// 這里指定下載文件的文件名
            a.click();
            // 釋放之前創(chuàng)建的URL對象
            window.URL.revokeObjectURL(url);
        }).catch(function (reason) {
            console.log(reason)
        })
    }
</script>
</html>

index.js:使用express來渲染index.html頁面,并且來處理下載請求。

var fs = require('fs');
var express = require('express');

var app = express();

// 渲染index.html,跟下載邏輯無關(guān)
app.get('/index.html', function (request, response) {
    fs.readFile('index.html', function (err, data) {
        if (!err) {
            response.end(data);
        }
    });
});

// 處理下載文件的請求
app.post('/file/download', function (request, response) {
    var name = "hello.txt";// 待下載的文件名
    var path = __dirname + "/" + name;// 待下載文件的路徑,指定為當(dāng)前項目目錄下的hello.txt文件
    var f = fs.createReadStream(path);
    response.writeHead(200, {
        'Content-Type': 'application/force-download',
        'Content-Disposition': 'attachment; filename=' + name
    });
    f.pipe(response);
});

// 監(jiān)聽端口,相當(dāng)于原來的server.listen()
app.listen(8888, function () {
    console.log("app is running at port 8888.");
});

又可以通過response.set()方法來設(shè)置響應(yīng)頭:

    response.set({
        'Content-Type': 'application/octet-stream',// 告訴瀏覽器這是一個二進(jìn)制文件
        'Content-Disposition': 'attachment; filename=' + name// 告訴瀏覽器這是一個需要下載的文件
    });

總結(jié)

下載文件其實很簡單,在哪種語言里都是這樣:

第一步,設(shè)置響應(yīng)頭。第二步,返回數(shù)據(jù)流。

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

下載文件需要設(shè)置的響應(yīng)頭是Content-TypeContent-Disposition,響應(yīng)頭與編程語言無關(guān),是通用的。

'Content-Type': 'application/octet-stream'表示這是一個二進(jìn)制文件。

'Content-Disposition': 'attachment;filename=hello.txt'表示這是一個需要下載的附件,并且告訴瀏覽器默認(rèn)文件名。

返回數(shù)據(jù)流

讀取要下載的文件,以二進(jìn)制流的形式響應(yīng)給客戶端。

到此這篇關(guān)于Node.js實現(xiàn)下載文件的兩種實用方式的文章就介紹到這了,更多相關(guān)Node.js下載文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用nvm實現(xiàn)多個nodejs版本的快速切換

    使用nvm實現(xiàn)多個nodejs版本的快速切換

    NodeJS的升級比較快,在開發(fā)中要使用最新的版本,必須經(jīng)常升級,但對于一些老項目可能又要使用低版本的NodeJS,使用nvm工具可以方便的管理下載的NodeJS版本,并通過命令實現(xiàn)NodeJS版本的快速切換,需要的朋友可以參考下
    2024-09-09
  • package.json版本號符號^和~前綴的區(qū)別

    package.json版本號符號^和~前綴的區(qū)別

    這篇文章介紹了package.json版本號符號^和~前綴的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Node.js開發(fā)之訪問Redis數(shù)據(jù)庫教程

    Node.js開發(fā)之訪問Redis數(shù)據(jù)庫教程

    這篇文章主要介紹了Node.js開發(fā)之訪問Redis數(shù)據(jù)庫教程,本文講解了安裝Redis的Node.js驅(qū)動、編寫測試程序以及npm遠(yuǎn)程服務(wù)器連接十分緩慢的解決方法,需要的朋友可以參考下
    2015-01-01
  • Node.js + Redis Sorted Set實現(xiàn)任務(wù)隊列

    Node.js + Redis Sorted Set實現(xiàn)任務(wù)隊列

    本文給大家分享的是使用Node.js + Redis Sorted Set實現(xiàn)任務(wù)隊列的方法示例,非常的實用,有需要的小伙伴可以參考下
    2016-09-09
  • AngularJS + Node.js + MongoDB開發(fā)的基于高德地圖位置的通訊錄

    AngularJS + Node.js + MongoDB開發(fā)的基于高德地圖位置的通訊錄

    這篇文章主要介紹了AngularJS + Node.js + MongoDB開發(fā)的基于高德地圖位置的通訊錄,需要的朋友可以參考下
    2015-01-01
  • NodeJS簡單實現(xiàn)WebSocket功能示例

    NodeJS簡單實現(xiàn)WebSocket功能示例

    這篇文章主要介紹了NodeJS簡單實現(xiàn)WebSocket功能,結(jié)合具體實例形式分析了nodejs實現(xiàn)WebSocket通信功能的客戶端與服務(wù)器端相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • nodeJS進(jìn)程管理器pm2的使用

    nodeJS進(jìn)程管理器pm2的使用

    這篇文章主要介紹了nodeJS進(jìn)程管理器pm2的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建

    Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建

    這篇文章主要為大家介紹了Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • node.js平臺下的mysql數(shù)據(jù)庫配置及連接

    node.js平臺下的mysql數(shù)據(jù)庫配置及連接

    本文主要介紹了node.js平臺下的mysql數(shù)據(jù)庫配置及連接的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • Node.js和MongoDB實現(xiàn)簡單日志分析系統(tǒng)

    Node.js和MongoDB實現(xiàn)簡單日志分析系統(tǒng)

    這篇文章主要介紹了Node.js和MongoDB實現(xiàn)簡單日志分析系統(tǒng),本文給出了服務(wù)器端、客戶端、圖表生成、Shell自動執(zhí)行等功能的實現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04

最新評論

永定县| 平乡县| 中山市| 自治县| 兰西县| 清流县| 大兴区| 苏州市| 会同县| 苍梧县| 仁寿县| 城步| 涞源县| 鄂伦春自治旗| 仁怀市| 遵义市| 克东县| 满城县| 文昌市| 娄底市| 大兴区| 防城港市| 佛山市| 九寨沟县| 赤壁市| 桓台县| 浙江省| 秦皇岛市| 郎溪县| 巴彦淖尔市| 元氏县| 金昌市| 阳山县| 泰宁县| 古蔺县| 安吉县| 绥德县| 曲阜市| 卢龙县| 涟水县| 边坝县|