我今天下載了一些東西,我知道它只有 1.8 GB,但下載 1.8/1.8 GB 後,最奇怪的事情發生了。 Chrome 不斷下載文件,進度條開始顯示載入動畫,文件大小不斷增加,直到 2.5 GB 後最終停止。這是一個視訊文件,它在我的磁碟上顯示為 2.5 GB,但它甚至無法播放。這是怎麼發生的?
答案1
header是 HTTP 協定一部分的眾多回應標頭之一Content-Length
。這本質上是讓伺服器告訴客戶端回應中發送的資料有多大。與大多數智慧瀏覽器一樣,Chrome 使用此標頭來確定下載檔案時顯示的總檔案大小以及計算顯示的下載進度。
但這有兩個問題:
- 並不嚴格要求伺服器發送此標頭(僅在某些情況下需要,而不是全部)。很少會看到伺服器不會發送本機磁碟上實際檔案的內容,但當內容是動態產生並在生成時發送時(例如,由某些雲端儲存動態產生的 ZIP 存檔),這種情況並不罕見。允許客戶一次下載所有文件組的服務)屬於此類)。發生這種情況時,Chrome 將顯示下載進度,但不顯示實際完成百分比,而是顯示通常的載入欄來指示下載正在繼續。
- 出於相容性原因,在不需要標頭但無論如何都發送的情況下,必須將其視為建議訊息,而不是嚴格指示回應的大小。這裡列出的原因太多了,但結果是,當獲取(或下載)資源時,Chrome(和大多數瀏覽器)會不斷獲取數據,直到伺服器在這些情況下停止發送數據,因為它們不信任該資料標頭所說的內容是準確的(事實上,Chrome 會隱藏下載時報告的檔案大小和實際檔案大小之間的微小差異
你的案例中發生的事情是第二個問題的結果。當它達到“完整”檔案大小並不斷獲取資料時,Chrome 最終會切換到顯示類似不知道正在下載的檔案大小時的顯示方式。想到的兩個可能的原因要么是錯誤(在伺服器中,要么在某些中間系統中),要么是惡意活動(如果是這種情況,可能是中間人攻擊或受損的伺服器)。
不管怎樣,這可能應該報告給擁有您下載影片的網站的人,因為任何一種情況對他們來說都可能是壞消息。
順便說一句,如果 Chrome 能夠比將其寫入本地磁碟的速度更快地從網路獲取整個文件,您還可以看到與此類似的行為,但文件大小不會增加。