zoukankan      html  css  js  c++  java
  • web开发下的各种下载方法

    利用TransmitFile方法,解决Response.BinaryWrite下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下:

     Response.ContentType = "application/x-zip-compressed";
      Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
      string filename = Server.MapPath("DownLoad/aaa.zip");
      Response.TransmitFile(filename);

    IO的WriteFile实现下载

     string fileName ="aaa.zip";//客户端保存的文件名
      string filePath=Server.MapPath("DownLoad/aaa.zip");//路径
    
      FileInfo fileInfo = new FileInfo(filePath);
      Response.Clear();
      Response.ClearContent();
      Response.ClearHeaders();
      Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
      Response.AddHeader("Content-Length", fileInfo.Length.ToString());
      Response.AddHeader("Content-Transfer-Encoding", "binary");
      Response.ContentType = "application/octet-stream";
      Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
      Response.WriteFile(fileInfo.FullName);
      Response.Flush();
      Response.End();

    WriteFile分块下载

    string fileName = "aaa.zip";//客户端保存的文件名
      string filePath = Server.MapPath("DownLoad/aaa.zip");//路径
    
      System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
    
      if (fileInfo.Exists == true)
      {
      const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
      byte[] buffer = new byte[ChunkSize];
    
      Response.Clear();
      System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
      long dataLengthToRead = iStream.Length;//获取下载的文件总大小
      Response.ContentType = "application/octet-stream";
      Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
      while (dataLengthToRead > 0 && Response.IsClientConnected) 
      {
      int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
      Response.OutputStream.Write(buffer, 0, lengthRead);
      Response.Flush();
      dataLengthToRead = dataLengthToRead - lengthRead;
      }
      Response.Close();
      }

      //流方式下载

     string fileName = "aaa.zip";//客户端保存的文件名
      string filePath = Server.MapPath("DownLoad/aaa.zip");//路径
    
      //以字符流的形式下载文件
      FileStream fs = new FileStream(filePath, FileMode.Open);
      byte[] bytes = new byte[(int)fs.Length];
      fs.Read(bytes, 0, bytes.Length);
      fs.Close();
      Response.ContentType = "application/octet-stream";
      //通知浏览器下载文件而不是打开
      Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
      Response.BinaryWrite(bytes);
      Response.Flush();
      Response.End();

    最后一种支持断点下载

    /// <summary>
            /// 支持断点续传的下载大文件的函数
            /// </summary>
            /// <param name="downloadFilePath">被下载文件的路径,相对和绝对都可以</param>
            /// <param name="showFileName">显示给用户的文件名,可以为空</param>
            /// <param name="fileType">要下载的文件类型,如果不确定,请留空</param>
            /// <remarks>用于大文件的下载</remarks>
            public static void BigFileDownload(string downloadFilePath, string showFileName, string fileType)
            {
                downloadFilePath = downloadFilePath.Trim();
                if(string.Empty == downloadFilePath)
                    ShowErrorMessage("没有指定要下载的文件路径!");
                
                if(downloadFilePath.IndexOf(":") < 0)
                    downloadFilePath = System.Web.HttpContext.Current.Server.MapPath(downloadFilePath);
    
                showFileName = showFileName.Trim();
                if(string.Empty == showFileName)
                    showFileName = Path.GetFileName(downloadFilePath);
    
                showFileName = System.Web.HttpUtility.UrlEncode(System.Web.HttpContext.Current.Request.ContentEncoding.GetBytes(showFileName));
                
                fileType = fileType.Trim();
                if(string.Empty == fileType)
                    fileType = "application/octet-stream";
    
                System.Web.HttpContext.Current.Response.Clear();
                Stream objStream = null;
                byte[] btBuffer = new byte[8192];  // 1024*8 = 8Kb
                int intLength = 0;
                long lngData2Read = 0;
                try
                {
                    using(objStream = new FileStream(downloadFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        lngData2Read = objStream.Length;
                        
                        输出HTTP头信息
                        
                        while(lngData2Read > 0)
                        {
                            if(HttpContext.Current.Response.IsClientConnected)
                            {
                                intLength = objStream.Read(btBuffer, 0, 8192);
                                HttpContext.Current.Response.OutputStream.Write(btBuffer, 0, intLength);
                                HttpContext.Current.Response.Flush();
                                lngData2Read -= intLength;
                                btBuffer = new byte[8192];
                            }
                            else
                            {
                                lngData2Read = -1;
                            }
                        }
                    }
                }
                catch(Exception ex)
                {
                    ShowErrorMessage(ex.Message);
                }
                // 结束文件下载,此句不可缺少,否则会把本页的HTML代码一起下载文件里
                HttpContext.Current.Response.End();
            }
    
            /// <summary>
            /// 输出错误信息给用户,采用客户端弹出框的方式
            /// </summary>
            /// <param name="errorMessage">错误信息的内容</param>
            internal static void ShowErrorMessage(string errorMessage)
            {
                errorMessage = errorMessage.Replace("'", """);
                System.Web.HttpContext.Current.Response.Write("<script language='javascript'>");
                System.Web.HttpContext.Current.Response.Write("alert('");
                System.Web.HttpContext.Current.Response.Write(errorMessage);
                System.Web.HttpContext.Current.Response.Write("');</script>");
                System.Web.HttpContext.Current.Response.End();
            }
  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/jxluowei/p/3238507.html
Copyright © 2011-2022 走看看