2012-03-30 224 views
1

我正在開發一個Web應用程序,用戶可以使用它查看iPad(Safari瀏覽器)中的文件。我可以下載並查看.pdf,.doc,.ppt文件。但我無法下載並查看MP4和3GP文件。我在IIS中添加了正確的MIME類型。我在Safari(iPad)「BYTE_RANGE_ERROR_MESSAGE」中遇到以下錯誤。我在Windows Server 2008中使用IIS 7.0。無法在iPad中下載和播放mp4/3gp文件

注意:我可以使用IE,Mozilla和Safari下載PC中的所有文件。

回答

1

下面的示例代碼將幫助您通過asp.net處理程序傳輸mp4視頻。在ProcessRequest方法

private void RangeDownload(string fullpath,HttpContext context) 
{ 
    long size,start,end,length,fp=0; 
    using (StreamReader reader = new StreamReader(fullpath)) 
    {    
     size = reader.BaseStream.Length;  
     start = 0; 
     end = size - 1; 
     length = size; 
     context.Response.AddHeader("Accept-Ranges", "0-" + size); 

     if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"])) 
     { 
      long anotherStart = start; 
       long anotherEnd = end; 
       string[] arr_split = context.Request.ServerVariables["HTTP_RANGE"].Split(new char[] { Convert.ToChar("=") }); 
       string range = arr_split[1]; 

      // Make sure the client hasn't sent us a multibyte range 
      if (range.IndexOf(",") > -1) 
      {      
        context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
        throw new HttpException(416, "Requested Range Not Satisfiable"); 

       } 


       if (range.StartsWith("-")) 
       { 
        // The n-number of the last bytes is requested 
        anotherStart = size - Convert.ToInt64(range.Substring(1)); 
       } 
       else 
       { 
        arr_split = range.Split(new char[] { Convert.ToChar("-") }); 
        anotherStart = Convert.ToInt64(arr_split[0]); 
       long temp = 0; 
        anotherEnd = (arr_split.Length > 1 && Int64.TryParse(arr_split[1].ToString(), out temp)) ? Convert.ToInt64(arr_split[1]) : size; 
       } 

       anotherEnd = (anotherEnd > end) ? end : anotherEnd; 

       if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size) 
       { 

        context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
       throw new HttpException(416, "Requested Range Not Satisfiable"); 
      } 
      start = anotherStart; 
       end = anotherEnd; 

       length = end - start + 1; // Calculate new content length 
      fp = reader.BaseStream.Seek(start, SeekOrigin.Begin); 
      context.Response.StatusCode = 206; 
      } 
    } 
      // Notify the client the byte range we'll be outputting 
     context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
     context.Response.AddHeader("Content-Length", length.ToString()); 
     // Start buffered download 
      context.Response.WriteFile(fullpath, fp, length); 
      context.Response.End(); 

} 

樣品使用功能

string mimetype = "video/mp4"; 
if (System.IO.File.Exists(file)) 
{ 
    context.Response.ContentType = mimetype; 
    if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"])) 
    { 
     //request for chunk 
     RangeDownload(file, context); 
    } 
    else  
    { 
     //ask for all 
     long fileLength = File.OpenRead(file).Length; 
     context.Response.AddHeader("Content-Length", fileLength.ToString()); 
     context.Response.WriteFile(file); 
    } 
} 
else 
{ 
    throw new HttpException(404, "Video Not Found Path:" + file); 
} 

希望這個代碼將幫助你。

+0

感謝它解決了我的問題。 – 2012-04-16 02:20:12