HTTP 協定中,客戶端可在請求標頭加入 Range: bytes=起始位置-,告知伺服器從指定位元組繼續傳輸。伺服器回應 206 Partial Content,並在回應標頭包含 Content-Range 與 Content-Length。
GET /image/index_r4_c1.jpg HTTP/1.1
Host: 192.168.3.120:8080
Connection: Keep-Alive
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 2827
Accept-Ranges: bytes
GET /image/index_r4_c1.jpg HTTP/1.1
Range: bytes=1024-
HTTP/1.1 206 Partial Content
Content-Type: image/jpeg
Content-Length: 1803
Content-Range: bytes 1024-2826/2827
Accept-Ranges: bytes
Request.Headers["Range"] != nulllong startPos = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Split('-')[0]);Response.StatusCode = 206;private void Page_Load(object sender, EventArgs e)
{
string file = MapPath("ff.zip");
FileInfo fi = new FileInfo(file);
long startPos = 0;
long fileTranLen = fi.Length;
// 斷點續傳請求
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
startPos = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Split('-')[0]);
fileTranLen -= startPos;
Response.AddHeader("Content-Range",
string.Format("bytes {0}-{1}/{2}", startPos, startPos + fileTranLen - 1, fi.Length));
}
Response.AddHeader("Content-Length", fileTranLen.ToString());
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fi.Name);
using (FileStream fileStream = File.OpenRead(file))
{
fileStream.Position = startPos;
byte[] buffer = new byte[1024];
int count;
while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
Response.OutputStream.Write(buffer, 0, count);
}
}
Response.End();
}
Response.IsClientConnected 檢查,客戶端中斷時停止傳輸bytes=0-100,200-300)需更複雜的邏輯,本範例僅示範單一範圍