《PHP實(shí)戰(zhàn):PHP實(shí)現(xiàn)文件下載斷點(diǎn)續(xù)傳詳解》要點(diǎn):
本文介紹了PHP實(shí)戰(zhàn):PHP實(shí)現(xiàn)文件下載斷點(diǎn)續(xù)傳詳解,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
PHP教程如果我們的網(wǎng)站提供文件下載的服務(wù),那么通常我們都希望下載可以斷點(diǎn)續(xù)傳(Resumable Download),也就是說(shuō)用戶(hù)可以暫停下載,并在未來(lái)的某個(gè)時(shí)間從暫停處繼續(xù)下載,而不必重新下載整個(gè)文件.
PHP教程通常情況下,Web服務(wù)器(如Apache)會(huì)默認(rèn)開(kāi)啟對(duì)斷點(diǎn)續(xù)傳的支持.因此,如果直接通過(guò)Web服務(wù)器來(lái)提供文件的下載,可以不必做特別的配置,即可享受到斷點(diǎn)續(xù)傳的好處.由于這些文件直接通過(guò)Web服務(wù)器來(lái)提供下載,后端腳本無(wú)法對(duì)這個(gè)下載過(guò)程進(jìn)行控制.這對(duì)于僅提供公開(kāi)、靜態(tài)文件的網(wǎng)站來(lái)說(shuō)不是問(wèn)題,但對(duì)于必要提供私有、動(dòng)態(tài)文件的網(wǎng)站來(lái)說(shuō),直接通過(guò)Web服務(wù)器來(lái)提供下載就無(wú)法滿(mǎn)足需求了.這時(shí),就必要在編寫(xiě)后臺(tái)腳本程序時(shí),加入對(duì)斷點(diǎn)續(xù)傳的支持.
PHP教程本文將以PHP為例,簡(jiǎn)要介紹實(shí)現(xiàn)文件下載斷點(diǎn)續(xù)傳的辦法.
PHP教程原理
PHP教程斷點(diǎn)續(xù)傳的原理還是比擬直觀的.
PHP教程HTTP協(xié)議規(guī)定了如何傳輸某個(gè)資源的一部分,而不是全部.比如,有一個(gè)文件的大小是1000字節(jié),瀏覽器可以只哀求該文件的前300個(gè)字節(jié),或者只哀求第500到第1000個(gè)字節(jié).通過(guò)這種方式,就可以不必在一次哀求中傳輸某個(gè)資源的全部?jī)?nèi)容,而是發(fā)起多次哀求,每次僅哀求其中的一部分內(nèi)容.等所有這些哀求都返回之后,再把得到的內(nèi)容一塊一塊的拼接起來(lái)得到完整的資源.
PHP教程實(shí)現(xiàn)斷點(diǎn)續(xù)傳就是要利用HTTP協(xié)議的上述特性.當(dāng)用戶(hù)暫停下載的時(shí)候,瀏覽器會(huì)記錄已經(jīng)下載到什么位置,當(dāng)用戶(hù)在未來(lái)某一時(shí)間恢復(fù)下載時(shí),就可以從上次暫停的位置繼續(xù)下載,而不必從頭開(kāi)始.
PHP教程實(shí)現(xiàn)
PHP教程由于部分傳輸不是強(qiáng)制的,服務(wù)器可以支持也可以不支持,所以,我們需要在程序中告訴瀏覽器,它哀求的資源是否支持部分傳輸.這可以通過(guò)設(shè)置HTTP的 Accept-Ranges 響應(yīng)頭信息來(lái)實(shí)現(xiàn).PHP代碼如下:
PHP教程當(dāng)接受到一個(gè)哀求時(shí),我們需要從瀏覽器的哀求中提取瀏覽器具體是在哀求資源的哪一個(gè)部分.這個(gè)信息是通過(guò) Range 哀求頭來(lái)傳遞的.在PHP中,它被存儲(chǔ)在$_SERVER['HTTP_RANGE']中.我們需要檢查這個(gè)變量是否定義了,如果定義了,則使用該值,否則,就將range設(shè)為整個(gè)資源.
PHP教程1.開(kāi)始位置非負(fù)
2.結(jié)束位置需要大于開(kāi)始位置
3.開(kāi)始位置需要小于文件長(zhǎng)度減一 (因?yàn)檫@里的位置索引是從0開(kāi)始的)
4.若結(jié)束位置大于文件長(zhǎng)度減一,則需要把它的值設(shè)置為文件長(zhǎng)度減一
PHP教程如果Range的取值不合法,則必要終止程序并告知瀏覽器:
PHP教程接下來(lái)要做的就是把文件的對(duì)應(yīng)部分的內(nèi)容發(fā)送給瀏覽器.不過(guò)要注意的是,這里涉及到需要發(fā)送多個(gè)HTTP響應(yīng)頭信息,具體如下:
PHP教程/* 輸出文件的指定部分 */
PHP教程總結(jié)
PHP教程文件下載的斷點(diǎn)續(xù)傳實(shí)際上是利用了HTTP協(xié)議中對(duì)傳輸部分文件的支持.而HTTP協(xié)議的這一特性不僅可以用于實(shí)現(xiàn)斷點(diǎn)續(xù)傳,客戶(hù)端程序也可以利用它來(lái)實(shí)現(xiàn)多線(xiàn)程下載.
PHP教程在實(shí)現(xiàn)斷點(diǎn)續(xù)傳的過(guò)程中,必要注意正確設(shè)置各種HTTP頭信息.錯(cuò)誤的頭信息將導(dǎo)致用戶(hù)下載到的文件損壞,無(wú)法使用.
歡迎參與《PHP實(shí)戰(zhàn):PHP實(shí)現(xiàn)文件下載斷點(diǎn)續(xù)傳詳解》討論,分享您的想法,維易PHP學(xué)院為您提供專(zhuān)業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/14538.html