[导入]ASP.NET断点续传和多线程下载
生活随笔
收集整理的這篇文章主要介紹了
[导入]ASP.NET断点续传和多线程下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??? 在解決etag的問題后,那個.vga文件還是不能正常播放,我只好用最后一招,通過VS.NET斷點來監測程序的流程,在我檢查Request.Header的時候,忽然發現一項:"Accept-Ranges: bytes0-31",這是什么東東?好像很熟的樣子,通過在flashget中一看才知道,原來是斷點續傳的起始位置和結束位置。我忽然想起我的系統不支持斷點續傳,而這個再現播放的控件應該是通過斷點續傳實現的,這應該就是問題所在。
??? 知道問題就好說了,從網上參考了一段代碼用來搞斷點續傳的(Asp.net(c#)實現多線程斷點續傳)。
??? 看起來確實不錯,通過了flashget的測試。
??? 可是我用來測試那個screen.vga,可是依然不能顯示,究竟是什么原因呢?
??? 繼續用VS.NET斷點來監測程序的流程,終于發現問題所在,原來flashget使用Accept-Ranges: bytes0-格式的header來發送請求,也就是說只講明從什么地方開始而不講明結束(莫認識文件尾部),而上面的程序也是針對flashget來設計的,卻沒有考慮到Accept-Ranges: bytes0-31這種有頭有尾的格式。
??? 那就容易了,到現在,也該自己寫寫代碼了,不能總靠從網上找現成的,呵呵
??? 以下是整個load.aspx的代碼:
?
<%@?import?Namespace="System.IO"?%><script?runat="server">
????private?void?Page_Load(object?sender,?System.EventArgs?e)
????{
?string?queryString=Request.QueryString.GetValues(0)[0];
?string?fileSpec=Page.Server.MapPath("../resData/"+queryString);
//設置響應時間,以備大文件輸出
????????Page.Server.ScriptTimeout=30000000;
?//開始輸出文件
?System.IO.Stream?iStream?=?null;
?byte[]?buffer?=?new?Byte[10000];
?int?length;
?long?dataToRead;
?FileInfo?fileInfo=new?FileInfo(fileSpec);
?try
?{//清空已有內容
??Response.ClearContent();
??Response.ClearHeaders();
//開始檢測Range中的斷點續傳塊信息
??long?startPoint?=?0,endPoint=fileInfo.Length-1;
??if(Request.Headers["Range"]!=null)
??{
???Response.StatusCode?=?206;
???string?temp=Request.Headers["Range"].Replace("bytes=","");
???if(!temp.StartsWith("-"))
????startPoint=?long.Parse(temp.Substring(0,temp.IndexOf(''-'')));
???if(!temp.EndsWith("-"))
????endPoint=long.Parse(temp.Substring(temp.IndexOf(''-'')+1));
??}
//返回塊信息和文件大小
??Response.AppendHeader("Content-Range","bytes?"?+?startPoint.ToString()?+?"-"?+endPoint.ToString()?+?"/"?+?fileInfo.Length.ToString());???
??Response.AppendHeader("Content-Length",((long)(endPoint-startPoint+1)).ToString());
//添加依賴文件,設置etag和LastModified,文件名等頭信息
??Response.AddFileDependency(fileSpec);
??Response.Cache.SetCacheability(HttpCacheability.Public);
??Response.Cache.SetETagFromFileDependencies();
??Response.Cache.SetLastModifiedFromFileDependencies();
??Response.AppendHeader("Content-Disposition","attachment;filename="+System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(fileInfo.Name)));
??Response.ContentType?=?GetContentType(fileSpec);
//開始輸出文件
??iStream?=?new?System.IO.FileStream(fileSpec,?System.IO.FileMode.Open,System.IO.FileAccess.Read,System.IO.FileShare.Read);
??iStream.Position?=?startPoint;
??dataToRead?=?endPoint?-?startPoint+1;
??while?(dataToRead?>?0)
??{
???if?(Response.IsClientConnected)?
???{
????if(dataToRead>10000)
?????length=10000;
????else
?????length=(int)dataToRead;
????length?=?iStream.Read(buffer,?0,length);
????Response.OutputStream.Write(buffer,?0,?length);
????Response.Flush();
????buffer=?new?Byte[10000];
????dataToRead?=?dataToRead?-?length;
???}
???else
???{
????dataToRead?=?-1;
???}
??}
?}
?catch?(Exception?ex)?
?{
??Response.Write("Error?:?"?+?ex.Message);
?}
?finally
?{
??if?(iStream?!=?null)?
??{
???iStream.Close();
??}
?}
????}
????private?string?GetContentType(string?fileSpec)
????{
?string?contentType;
?switch?(Path.GetExtension(fileSpec))
?{
case?".3gp":?contentType="audio/AMR-WB-encrypted";?break;
case?".m4a":?contentType="audio/m4a";??break;
case?".mid":?contentType="audio/midi";??break;
case?".mp1":?contentType="audio/mp1";??break;
case?".mp2":?contentType="audio/mp2";??break;
case?".mp3":?contentType="audio/mpeg";??break;
case?".m3u":?contentType="audio/mpegurl";??break;
case?".mpga":?contentType="audio/rn-mpeg";??break;
case?".pls":?contentType="audio/scpls";??break;
case?".ra":?contentType="audio/vnd.rn-realaudio";?break;
case?".wav":?contentType="audio/wav";??break;
case?".aiff":?contentType="audio/x-aiff";??break;
case?".wax":?contentType="audio/x-ms-wax";??break;
case?".wma":?contentType="audio/x-ms-wma";??break;
case?".aif":?contentType="audio/x-pn-aiff";??break;
case?".au":?contentType="audio/x-pn-au";??break;
case?".ram":?contentType="audio/x-pn-realaudio";?break;
case?".rms":?contentType="audio/x-realaudio-secure";?break;
case?".bmp":?contentType="image/bmp";??break;
case?".gif":?contentType="image/gif";??break;
case?".jpg":?contentType="image/jpeg";??break;
case?".png":?contentType="image/png";??break;
case?".tif":?contentType="image/tiff";??break;
case?".rp":?contentType="image/vnd.rn-realpix";?break;
case?".ico":?contentType="image/x-icon";??break;
case?".xbm":?contentType="image/x-xbitmap";??break;
case?".css":?contentType="text/css";???break;
case?".htm":?contentType="text/html";??break;
case?".uls":?contentType="text/iuls";??break;
case?".txt":?contentType="text/plain";??break;
case?".wsc":?contentType="text/scriptlet";??break;
case?".rt":?contentType="text/vnd.rn-realtext";?break;
case?".htt":?contentType="text/webviewhtml";??break;
case?".htc":?contentType="text/x-component";??break;
case?".vcf":?contentType="text/x-vcard";??break;
case?".xml":?contentType="text/xml";???break;
case?".3g2":?contentType="video/3gpp2";??break;
case?".mpeg":?contentType="video/mpeg";??break;
case?".avi":?contentType="video/msvideo";??break;
case?".rv":?contentType="video/vnd.rn-realvideo";?break;
case?".mpa":?contentType="video/x-mpg";??break;
case?".asx":?contentType="video/x-ms-asf";??break;
case?".asf":?contentType="video/x-ms-asf";??break;
case?".wm":?contentType="video/x-ms-wm";??break;
case?".wmv":?contentType="video/x-ms-wmv";??break;
case?".wmx":?contentType="video/x-ms-wmx";??break;
case?".vga":?contentType="PowerCreator?VGAPlayer.Document";?break;
default:?contentType="Application/"+Path.GetExtension(fileSpec);break;
?}
????return?contentType;
????}
總結
以上是生活随笔為你收集整理的[导入]ASP.NET断点续传和多线程下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [票据打印]打印走纸控制(1) - 设置
- 下一篇: 地图知识-坐标网