Node.js實現(xiàn)下載文件的兩種實用方式
第一種方式:使用原生的http模塊
我們僅需要用到fs和http兩個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,則判斷進行處理
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 來進行訪問");
});
然后可以通過http://127.0.0.1:8888/download/hello.txt下載文件。

第二種方式:使用Express+Axios下載文件
前端通過axios發(fā)送GET或者POST請求來進行文件的下載,關(guān)鍵是對響應(yīng)回來的文件數(shù)據(jù)進行處理。
index.html:前端頁面,通過點擊按鈕來進行下載文件,而請求是通過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標簽
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',// 告訴瀏覽器這是一個二進制文件
'Content-Disposition': 'attachment; filename=' + name// 告訴瀏覽器這是一個需要下載的文件
});
總結(jié)
下載文件其實很簡單,在哪種語言里都是這樣:
第一步,設(shè)置響應(yīng)頭。第二步,返回數(shù)據(jù)流。
設(shè)置響應(yīng)頭
下載文件需要設(shè)置的響應(yīng)頭是Content-Type和Content-Disposition,響應(yīng)頭與編程語言無關(guān),是通用的。
'Content-Type': 'application/octet-stream'表示這是一個二進制文件。
'Content-Disposition': 'attachment;filename=hello.txt'表示這是一個需要下載的附件,并且告訴瀏覽器默認文件名。
返回數(shù)據(jù)流
讀取要下載的文件,以二進制流的形式響應(yīng)給客戶端。
到此這篇關(guān)于Node.js實現(xiàn)下載文件的兩種實用方式的文章就介紹到這了,更多相關(guān)Node.js下載文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用travis-ci如何持續(xù)部署node.js應(yīng)用詳解
最近在學(xué)習(xí)使用 travis-ci 對項目進行持續(xù)集成測試,所以下面這篇文章主要給大家介紹了關(guān)于使用travis-ci如何持續(xù)部署node.js應(yīng)用的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
kafka調(diào)試中遇到Connection to node -1 could not be established. Br
這篇文章主要介紹了kafka調(diào)試中遇到Connection to node -1 could not be established. Broker may not be available的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-09-09
nodejs使用Sequelize框架操作數(shù)據(jù)庫的實現(xiàn)
這篇文章主要介紹了nodejs使用Sequelize框架操作數(shù)據(jù)庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

