zoukankan      html  css  js  c++  java
  • FileDown.cs(20170223)

    using System;
    using System.IO;
    using System.Threading;
    using System.Web;
    
    namespace System.CRM.Common
    {
        /// <summary>
        /// 文件下载类
        /// </summary>
        public class FileDown
        {
            public FileDown()
            { }
    
            /// <summary>
            /// 参数为虚拟路径
            /// </summary>
            public static string FileNameExtension(string FileName)
            {
                return Path.GetExtension(MapPathFile(FileName));
            }
    
            /// <summary>
            /// 获取物理地址
            /// </summary>
            public static string MapPathFile(string FileName)
            {
                return HttpContext.Current.Server.MapPath(FileName);
            }
    
            /// <summary>
            /// 普通下载
            /// </summary>
            /// <param name="FileName">文件虚拟路径</param>
            public static void DownLoadold(string FileName)
            {
                string destFileName = MapPathFile(FileName);
                if (File.Exists(destFileName))
                {
                    FileInfo fi = new FileInfo(destFileName);
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.ClearHeaders();
                    HttpContext.Current.Response.Buffer = false;
                    HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(destFileName), System.Text.Encoding.UTF8));
                    HttpContext.Current.Response.AppendHeader("Content-Length", fi.Length.ToString());
                    HttpContext.Current.Response.ContentType = "application/octet-stream";
                    HttpContext.Current.Response.WriteFile(destFileName);
                    HttpContext.Current.Response.Flush();
                    HttpContext.Current.Response.End();
                }
            }
    
            /// <summary>
            /// 分块下载
            /// </summary>
            /// <param name="FileName">文件虚拟路径</param>
            public static void DownLoad(string FileName)
            {
                string filePath = MapPathFile(FileName);
                long chunkSize = 204800;             //指定块大小 
                byte[] buffer = new byte[chunkSize]; //建立一个200K的缓冲区 
                long dataToRead = 0;                 //已读的字节数   
                FileStream stream = null;
                try
                {
                    //打开文件   
                    stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                    dataToRead = stream.Length;
    
                    //添加Http头   
                    HttpContext.Current.Response.ContentType = "application/octet-stream";
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachement;filename=" + HttpUtility.UrlEncode(Path.GetFileName(filePath)));
                    HttpContext.Current.Response.AddHeader("Content-Length", dataToRead.ToString());
    
                    while (dataToRead > 0)
                    {
                        if (HttpContext.Current.Response.IsClientConnected)
                        {
                            int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
                            HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
                            HttpContext.Current.Response.Flush();
                            HttpContext.Current.Response.Clear();
                            dataToRead -= length;
                        }
                        else
                        {
                            dataToRead = -1; //防止client失去连接 
                        }
                    }
                }
                catch (Exception ex)
                {
                    HttpContext.Current.Response.Write("Error:" + ex.Message);
                }
                finally
                {
                    if (stream != null) stream.Close();
                    HttpContext.Current.Response.Close();
                }
            }
    
            /// <summary>
            ///  输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小
            /// </summary>
            /// <param name="_Request">Page.Request对象</param>
            /// <param name="_Response">Page.Response对象</param>
            /// <param name="_fileName">下载文件名</param>
            /// <param name="_fullPath">带文件名下载路径</param>
            /// <param name="_speed">每秒允许下载的字节数</param>
            /// <returns>返回是否成功</returns>
            //---------------------------------------------------------------------
            //调用:
            // string FullPath=Server.MapPath("count.txt");
            // ResponseFile(this.Request,this.Response,"count.txt",FullPath,100);
            //---------------------------------------------------------------------
            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 = (int)Math.Floor((double)(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((double)((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;
            }
    
    
            /// <summary>  
            /// 下载远程图片
            /// DownImage("http://portal.cjmex-jyds.cn/static/user_img/20160127044020_204558.jpg", @"C:UsersAdministratorDownloads20160127044020_204558.jpg");
            /// </summary>  
            /// <param name="Url">Url地址</param>  
            /// <param name="Path">保存路径</param>  
            public static void DownImage(string Url, string Path)
            {
                System.Net.WebClient web = new System.Net.WebClient();
                web.DownloadFile(Url, Path);
    
            }
    
    
            /// <summary>
            /// 下载服务器上的图片(非远程)
            /// 此方式不适用ajax,如果用ajax的话没有下载提示。
            /// 在这里不作调用
            /// </summary>
            /// <param name="context"></param>
            public static void DownImage2(HttpContext context)
            {
    
    
                try
                {
                    string FullFileName = context.Server.MapPath("files") + "\4bed2e738bd4b31c5aec920185d6277f9f2ff8bc.jpg"; //FileName--要下载的文件名 服务器上的图
                    FullFileName = FullFileName.Replace("\web", "");
                    System.IO.FileInfo DownloadFile = new System.IO.FileInfo(FullFileName);
                    if (DownloadFile.Exists)
                    {
                        context.Response.Clear();
                        context.Response.ClearHeaders();
                        context.Response.Buffer = false;
                        context.Response.ContentType = "application/octet-stream";
                        context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.Name, System.Text.Encoding.ASCII));
                        context.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
                        context.Response.WriteFile(DownloadFile.FullName);
                        context.Response.Flush();
                        context.Response.End();
                    }
                    else
                    {
                        //文件不存在 
                    }
                }
                catch
                {
                    //文件不存在
                }
            }
        }
    }
  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/zyx321/p/6435913.html
Copyright © 2011-2022 走看看