nodejs實現(xiàn)范圍請求的實現(xiàn)代碼
使服務(wù)器支持范圍請求,允許客戶端只請求文檔的一部分。其流程是:
- 客戶端向服務(wù)端發(fā)起請求
- 服務(wù)端響應(yīng),附上Accept-Ranges頭(值表示表示范圍的單位,通常是“bytes”),告訴客戶端其接受范圍請求
- 客戶端發(fā)送新的請求,附上Ranges頭,告訴服務(wù)端請求的是一個范圍
- 服務(wù)端收到范圍請求,分情況響應(yīng):
- 范圍有效,服務(wù)端返回206 Partial Content,發(fā)送指定范圍內(nèi)內(nèi)容,并在Content-Range頭中指定該范圍
- 范圍無效,服務(wù)端返回416 Requested Range Not Satisfiable,并在Content-Range中指明可接受范圍
請求中的Ranges頭格式為(這里不考慮多范圍請求了):
Ranges: bytes=[start]-[end]
其中 start 和 end 并不是必須同時具有:
- 如果 end 省略,服務(wù)器應(yīng)返回從 start 位置開始之后的所有字節(jié)
- 如果 start 省略,end 值指的就是服務(wù)器該返回最后多少個字節(jié)
- 如果均未省略,則服務(wù)器返回 start 和 end 之間的字節(jié)
響應(yīng)中的Content-Range頭有兩種格式:
當(dāng)范圍有效返回 206 時:
Content-Range: bytes (start)-(end)/(total)
當(dāng)范圍無效返回 416 時:
Content-Range: bytes */(total)
//代碼實現(xiàn)
res.setHeader('Content-Range', `bytes */${totalSize}`);
添加函數(shù)處理范圍請求:
【注意】這里吧不合理的范圍請求直接設(shè)置為返回全部,如果想設(shè)置范圍錯誤就直接不返回可以設(shè)置http狀態(tài)碼為416
/**
* 范圍請求
* 不在合理的范圍內(nèi)就直接返回所有
* 在合理規(guī)范的范圍內(nèi)就按照返回對應(yīng)的部分
* @param {*} totleSize 總的范圍
* @param {*} req
* @param {*} res
*/
module.exports = (totleSize, req, res) => {
const range = req.headers['range'];
if (!range) {
return {code: 200};
}
const sizes = range.match(/bytes=(\d*)-(\d*)/);
const end = sizes[2] || totleSize - 1;
const start = sizes[1] || totleSize - end;
//不規(guī)范的范圍,是要直接一起返回,所以設(shè)置狀態(tài)碼200
if(start > end || start < 0 || end > totleSize) {
return {code: 200};
}
res.setHeader('Accept-Ranges', 'bytes');
res.setHeader('Content_Range', `bytes ${start}-${end}/${totleSize}`);
res.setHeader('Content_Length', end-start);
return {
code: 206,
start: parseInt(start),
end: parseInt(end)
};
};
范圍讀?。?/p>
let rs;
const { code, start, end } = range(stats.size, req, res);
if (code === 200) {
res.statusCode = 200;
rs = fs.createReadStream(filePath);
} else {
res.statusCode = 206;//表示是部分內(nèi)容
//創(chuàng)建一個流讀取文件, {start, end}表示文件讀取的起始點和終點
rs = fs.createReadStream(filePath, { start, end });
}
//有這個pipe就不需要再去調(diào)用end了,這樣直接調(diào)用end會導(dǎo)致res接受不到東西,因為pipe是異步的
rs.pipe(res);
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用puppeteer爬取網(wǎng)站并抓出404無效鏈接
自動化技術(shù)可以幫助我們做自動化測試,本篇文章主要介紹了使用puppeteer爬取網(wǎng)站并抓出404無效鏈接,可以檢查出無效鏈接,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Node.js中的Buffer對象及創(chuàng)建方式
node.js提供了一個Buffer對象來提供對二進制數(shù)據(jù)的操作,Buffer?類的實例類似于整數(shù)數(shù)組,但?Buffer?的大小是固定的、且在?V8?堆外分配物理內(nèi)存。本文給大家介紹Node.js中的Buffer對象及創(chuàng)建方式,感興趣的朋友一起看看吧2022-01-01
利用adb shell和node.js實現(xiàn)抖音搶紅包功能(推薦)
這篇文章主要介紹了利用adb shell和node.js實現(xiàn)抖音搶紅包功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02

