下載代碼
function downFile($filePath, $filesize) { // 設定檔案最長執行時間和記憶體 set_time_limit ( 0 ); ini_set ( 'memory_limit', '1024M' ); // 檢測檔案是否存在 if (! is_file ( $filePath )) { die ( "404 File not found!" ); } $filename = basename ( $filePath ); // 擷取檔案名稱字 $size = $filesize; // 開始寫輸出頭資訊 header ( "Cache-Control: public" ); // 設定輸出瀏覽器格式 header ( "Content-Type: application/octet-stream" ); header ( "Content-Disposition: attachment; filename=" . $filename ); header ( "Content-Transfer-Encoding: binary" ); header ( "Accept-Ranges: bytes" ); $range = 0; // 如果有$_SERVER['HTTP_RANGE']參數 if (isset ( $_SERVER ['HTTP_RANGE'] )) { /* * Range頭域 Range頭域可以請求實體的一個或者多個子範圍。 例如, 表示頭500個位元組:bytes=0-499 表示第二個500位元組:bytes=500-999 表示最後500個位元組:bytes=-500 表示500位元組以後的範圍:bytes=500- 第一個和最後一個位元組:bytes=0-0,-1 同時指定幾個範圍:bytes=500-600,601-999 但是伺服器可以忽略此要求標頭,如果無條件GET包含Range要求標頭,響應會以狀態代碼206(PartialContent)返回而不是以200 (OK). */ // 斷點後再次串連 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912- list ( $a, $range ) = explode ( "=", $_SERVER ['HTTP_RANGE'] ); // if yes, download missing part $size2 = $size - 1; // 檔案總位元組數 $new_length = $size2 - $range; // 擷取下次下載的長度 header ( "HTTP/1.1 206 Partial Content" ); header ( "Content-Length: {$new_length}" ); // 輸入總長 header ( "Content-Range: bytes {$range}-{$size2}/{$size}" ); // Content-Range: bytes 4908618-4988927/4988928 95%的時候 } else { // 第一次串連 $size2 = $size - 1; header ( "Content-Range: bytes 0-{$size2}/{$size}" ); // Content-Range: bytes 0-4988927/4988928 header ( "Content-Length: " . $size ); // 輸出總長 } // 開啟檔案 $fp = fopen ( "{$filePath}", "rb" ); // 設定指標位置 fseek ( $fp, $range ); // 虛幻輸出 while ( ! feof ( $fp ) ) { print (fread ( $fp, 1024 * 8 )) ; // 輸出檔案 flush (); // 輸出緩衝 ob_flush (); } fclose ( $fp ); exit ();}
雖然成功下載了大檔案,這個沒解決感覺不完美,求協助
代碼縮排好了
回複內容:
下載代碼
function downFile($filePath, $filesize) { // 設定檔案最長執行時間和記憶體 set_time_limit ( 0 ); ini_set ( 'memory_limit', '1024M' ); // 檢測檔案是否存在 if (! is_file ( $filePath )) { die ( "404 File not found!" ); } $filename = basename ( $filePath ); // 擷取檔案名稱字 $size = $filesize; // 開始寫輸出頭資訊 header ( "Cache-Control: public" ); // 設定輸出瀏覽器格式 header ( "Content-Type: application/octet-stream" ); header ( "Content-Disposition: attachment; filename=" . $filename ); header ( "Content-Transfer-Encoding: binary" ); header ( "Accept-Ranges: bytes" ); $range = 0; // 如果有$_SERVER['HTTP_RANGE']參數 if (isset ( $_SERVER ['HTTP_RANGE'] )) { /* * Range頭域 Range頭域可以請求實體的一個或者多個子範圍。 例如, 表示頭500個位元組:bytes=0-499 表示第二個500位元組:bytes=500-999 表示最後500個位元組:bytes=-500 表示500位元組以後的範圍:bytes=500- 第一個和最後一個位元組:bytes=0-0,-1 同時指定幾個範圍:bytes=500-600,601-999 但是伺服器可以忽略此要求標頭,如果無條件GET包含Range要求標頭,響應會以狀態代碼206(PartialContent)返回而不是以200 (OK). */ // 斷點後再次串連 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912- list ( $a, $range ) = explode ( "=", $_SERVER ['HTTP_RANGE'] ); // if yes, download missing part $size2 = $size - 1; // 檔案總位元組數 $new_length = $size2 - $range; // 擷取下次下載的長度 header ( "HTTP/1.1 206 Partial Content" ); header ( "Content-Length: {$new_length}" ); // 輸入總長 header ( "Content-Range: bytes {$range}-{$size2}/{$size}" ); // Content-Range: bytes 4908618-4988927/4988928 95%的時候 } else { // 第一次串連 $size2 = $size - 1; header ( "Content-Range: bytes 0-{$size2}/{$size}" ); // Content-Range: bytes 0-4988927/4988928 header ( "Content-Length: " . $size ); // 輸出總長 } // 開啟檔案 $fp = fopen ( "{$filePath}", "rb" ); // 設定指標位置 fseek ( $fp, $range ); // 虛幻輸出 while ( ! feof ( $fp ) ) { print (fread ( $fp, 1024 * 8 )) ; // 輸出檔案 flush (); // 輸出緩衝 ob_flush (); } fclose ( $fp ); exit ();}
雖然成功下載了大檔案,這個沒解決感覺不完美,求協助
代碼縮排好了