嚴格地說,你可能能夠通過使兩個HTTP請求,要做到這一點:
- 做一個
HEAD
請求,這應該返回Content-Length
頭,它告訴你的文件的大小。
- 做一個
GET
請求與Content-Range
標題請求最後N字節的文件。
當然,這隻有在文件中的行傾向於保持接近特定平均長度時纔有效。因此,如果您知道文件中的行傾向於有大約100個字節,並且您希望最後20行,則可以請求最後一個例如2400個字節(20行✕100字節+ 20%,以獲得較好的效果)。然後,您可以解析響應以獲取最後20行。
這是未經測試的(因爲我沒有一個方便測試的服務器)並且沒有任何錯誤處理,但是像這樣的東西應該能夠工作,假設lighttpd被配置爲返回Content-Range
頭部, HEAD請求:
var url = "http://example.com/some-file.txt",
averageLineLength = 100,
numLinesToFetch = 20,
marginForError = 0.2,
bytesToFetch = averageLineLength * numLinesToFetch * (1 + marginForError)
;
$.ajax({ url: url, type: "HEAD" })
.then(function(_, _, xhr) {
var fileSize = parseInt(xhr.getResponseHeader('Content-Length')),
contentRangeStart = fileSize - bytesToFetch,
contentRangeEnd = fileSize - 1,
contentRange = contentRangeStart + "-" + contentRangeEnd + "/" + fileSize,
headers = { "Content-Length": bytesToFetch,
"Content-Range": "bytes " + contentRange }
;
return $.ajax({ url: url, type: "GET", headers: headers });
})
.then(function(data, statusText, xhr) {
var lines = data.split("\n");
lines = lines.slice(numLinesToFetch * -1);
console.log("Last " + numLinesToFetch + " lines:\n",
lines);
})
;
這是一種令人費解,並要求每次請求額外的數據(如果你得到大量的數據有記憶的影響,特別是與天真data.split
),我不當然,如果lighthttp裝備好了,可以開箱即用,但這是一個主意!
我不認爲這是可能的。爲什麼你不能使用PHP?當您向服務器請求(請求)文件時,服務器必須最終發送整個文件。 – soktinpk
@soktinpk它使得我的RPi擁有更多的配置,我想盡可能簡單地保持它,如果這是不可能的,我可能不得不去用PHP。 – Linus
我可以想到的唯一方法是,那麼就是手動將大文件分割成500行單獨的塊。 – soktinpk