using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; namespace WebApi.Common { public class FileProvider { /// <summary> /// 下载文件(路径下载) /// </summary> /// <param name="filePath">文件绝对路径</param> /// <param name="fileName">文件保存名称</param> public static void DownLoadFile(string filePath, string fileName) { if (System.IO.File.Exists(filePath)) { if (HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent.ToUpper().IndexOf("FIREFOX", StringComparison.Ordinal) != -1) { fileName = "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileName)) + "?="; } else { fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); if (fileName != null) fileName = fileName.Replace("+", "%20"); } FileInfo fileInfo = new FileInfo(filePath); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); HttpContext.Current.Response.AddHeader("Content-Length", fileInfo.Length.ToString()); HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary"); HttpContext.Current.Response.ContentType = "application/octet-stream"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); HttpContext.Current.Response.WriteFile(fileInfo.FullName); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } else { HttpContext.Current.Response.Write("文件未找到"); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } } /// <summary> /// 文件下载(流下载) /// </summary> /// <param name="ms"></param> /// <param name="fileName"></param> public static void DownLoadFile(MemoryStream ms, string fileName) { if (ms != Stream.Null) { if (HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent.ToUpper().IndexOf("FIREFOX", StringComparison.Ordinal) != -1) { fileName = "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileName)) + "?="; } else { fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); if (fileName != null) fileName = fileName.Replace("+", "%20"); } HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=", fileName)); HttpContext.Current.Response.AddHeader("Content-Length", ms.Length.ToString()); HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary"); HttpContext.Current.Response.ContentType = "application/octet-stream;charset=utf-8"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8; HttpContext.Current.Response.BinaryWrite(ms.ToArray()); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); ms.Close(); ms.Dispose(); } } /// <summary> /// 文件下载(流下载) /// </summary> /// <param name="buffer"></param> /// <param name="fileName"></param> public static void DownLoadFile(byte[] buffer, string fileName) { if (HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent.ToUpper().IndexOf("FIREFOX", StringComparison.Ordinal) != -1) { fileName = "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileName)) + "?="; } else { fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); if (fileName != null) fileName = fileName.Replace("+", "%20"); } HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName)); HttpContext.Current.Response.AddHeader("Content-Length", buffer.Length.ToString()); HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary"); HttpContext.Current.Response.ContentType = "application/octet-stream;charset=utf-8"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8; HttpContext.Current.Response.BinaryWrite(buffer); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } } }