悉野小楼

导航

Asp.net下载文件

网站上的文件是临时文件, 浏览器下载完成, 网站需要将其删除.

下面的写法, 文件读写后没关闭, 经常删除失败.

/// <summary>
        /// 下载服务器文件,参数一物理文件路径(含文件名称及后缀),参数二文件名称
        /// </summary>
        /// <param name="PhysicalPath"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool DownLoad(string PhysicalPath, string fileName)
        {
            bool _bool = false;
            string[] arrSplit = PhysicalPath.Split('.');

            string fileType = arrSplit[arrSplit.Length - 1];//获得下载文件的类型
            try
            {
                if ("xls".Equals(fileType))
                {
                    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
                }
                //else if("xml".Equals(fileType))
                //{
                //    HttpContext.Current.Response.ContentType = "application/octet-stream";
                //}
                else
                {
                    HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
                }

                HttpContext.Current.Response.Charset = GlobalVar.ADMIN_CHARSET_ENCODING;
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");

                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + Utils.UrlEncode(fileName));//设置文件名称 
                HttpContext.Current.Response.TransmitFile(PhysicalPath);
                _bool = true;
            }
            catch
            {

                _bool = false;
            }
            finally
            {
                //发送到客户端的文件流,如果点击取消,此临时文件会一直打开着,无法快速删除,影响不大,之后再行解决
                //  HttpContext.Current.Response.Clear();
                //  HttpContext.Current.Response.Close();
            }

            return _bool;
        }


下面是正确写法, 解决用户点击取消, 临时文件还打开着的问题(down临时文件夹可不要)

/// <summary>
        /// 下载服务器文件,参数一物理文件路径(含文件名称及后缀),参数二文件名称
        /// </summary>
        /// <param name="PhysicalPath"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static void DownLoad(string PhysicalPath, string NewFileName)
        {
            //清空下down目录下大于1小时的文件
            string[] files = Directory.GetFiles(Utils.GetMapPath("down"));
            foreach (string str in files)
            {
                FileInfo fileInfo = new FileInfo(str);
                if (Math.Abs((fileInfo.CreationTime - DateTime.Now).TotalHours) > 1)
                {
                    try
                    {
                        File.Delete(str);
                    }
                    catch
                    {
                        Func.SaveLog(3, "删除" + str + "文件失败");
                    }
                }
            }

            //将要下载的文件复制到down临时文件夹
            string strDownFileName = Path.Combine(Utils.GetMapPath("down"), new Random().Next(int.MaxValue).ToString());
            File.Copy(PhysicalPath, strDownFileName, true);

            System.IO.Stream iStream = null;

            // Buffer to read 10K bytes in chunk:
            byte[] buffer = new Byte[10000];

            // Length of the file:
            int length;

            // Total bytes to read:
            long dataToRead;

            // Identify the file to download including its path.
            string filepath = strDownFileName;

            // Identify the file name.
            //string  filename  = System.IO.Path.GetFileName(filepath);

            try
            {
                // Open the file.
                iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                            System.IO.FileAccess.Read, System.IO.FileShare.Read);


                // Total bytes to read:
                dataToRead = iStream.Length;

                HttpContext.Current.Response.ContentType = "application/octet-stream";
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + Utils.UrlEncode(NewFileName));

                // Read the bytes.
                while (dataToRead > 0)
                {
                    // Verify that the client is connected.
                    if (HttpContext.Current.Response.IsClientConnected)
                    {
                        // Read the data in buffer.
                        length = iStream.Read(buffer, 0, 10000);

                        // Write the data to the current output stream.
                        HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);

                        // Flush the data to the HTML output.
                        HttpContext.Current.Response.Flush();

                        buffer = new Byte[10000];
                        dataToRead = dataToRead - length;
                    }
                    else
                    {
                        //prevent infinite loop if user disconnects
                        dataToRead = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                // Trap the error, if any.
                HttpContext.Current.Response.Write("Error : " + ex.Message);
            }
            finally
            {
                if (iStream != null)
                {
                    //Close the file.
                    iStream.Close();
                }
            }
        }

 

posted on 2013-07-12 10:32  悉野  阅读(317)  评论(0编辑  收藏  举报