2012-03-30 4 views
1

iPad(Safariブラウザ)でファイルを閲覧できるWebアプリケーションを開発中です。 .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ビデオをストリームするのに役立ちます。

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(); 

} 

processRequestメソッドの下の関数のサンプルを使用

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

私の問題を解決してくれてありがとう。 –

関連する問題