zoukankan      html  css  js  c++  java
  • 收藏:ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小) (转自: Arhrun) jerry

    // 输出硬盘文件,提供下载
      
    // 输入参数 _Request: Page.Request对象,  _Response: Page.Response对象, _fileName: 下载文件名, _fullPath: 带文件名下载路径, _speed 每秒允许下载的字节数
      
    // 返回是否成功
      public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed)
      {
       
    try
       {
        FileStream myFile 
    = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        BinaryReader br 
    = new BinaryReader(myFile);
        
    try
        {
         _Response.AddHeader(
    "Accept-Ranges""bytes");
         _Response.Buffer 
    = false;
         
    long fileLength = myFile.Length;
         
    long startBytes = 0;
         
         
    int pack = 10240//10K bytes
         
    //int sleep = 200;   //每秒5次   即5*10K bytes每秒
         int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
         
    if (_Request.Headers["Range"!= null)
         {
          _Response.StatusCode 
    = 206;
          
    string[] range = _Request.Headers["Range"].Split(new char[] {'=''-'});
          startBytes 
    = Convert.ToInt64(range[1]);
         }
         _Response.AddHeader(
    "Content-Length", (fileLength - startBytes).ToString());
         
    if (startBytes != 0)
         {
          _Response.AddHeader(
    "Content-Range"string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
         }
         _Response.AddHeader(
    "Connection""Keep-Alive");
         _Response.ContentType 
    = "application/octet-stream";
         _Response.AddHeader(
    "Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
     
         br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
         
    int maxCount = (int) Math.Floor((fileLength - startBytes) / pack) + 1;

         
    for (int i = 0; i < maxCount; i++)
         {
          
    if (_Response.IsClientConnected)
          {
           _Response.BinaryWrite(br.ReadBytes(pack));
           Thread.Sleep(sleep);
          }
          
    else
          {
           i
    =maxCount; 
          }
         }
        }
        
    catch
        {
         
    return false;
        }
        
    finally
        {
         br.Close();
         myFile.Close();
        }
       }
       
    catch
       {
        
    return false;
       }
       
    return true;
      }

    调用例

       Page.Response.Clear();
         
       bool success = ResponseFile(Page.Request, Page.Response, "filename", @"C:\download.date", 1024000);
      
       if(!success)
        Response.Write("下载文件出错!");
       Page.Response.End();

    通过这种方式实现的下载,可控性好,可以控制读取文件块的大小,可以有效的实现防盗、可以监控资源的下载等等。如果你能把他封装的很好的话,这将是一个非常强大的类。(百灵说:这段话是我自己加的,我正在试着封装。感谢:Arhrun  的 知识共享,thanks)

  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/mbailing/p/1861712.html
Copyright © 2011-2022 走看看