using Microsoft.AspNetCore.Http; using System.IO; using System.Threading.Tasks; using System.Web; namespace WMS.Util { public static class FileDownloadExtensions { public static async Task DownloadAsync(this HttpContext context, string fileName, string filePath) { if (!File.Exists(filePath)) { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync("File not found."); return; } var memory = new MemoryStream(); using var stream = new FileStream(filePath, FileMode.Open); await stream.CopyToAsync(memory); memory.Position = 0; var contentType = GetContentType(filePath); context.Response.ContentType = contentType; context.Response.Headers.Add("Content-Disposition", $"attachment; filename={fileName}"); context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.Body.WriteAsync(memory.ToArray()); } private static string GetContentType(string path) { var types = new Dictionary { {".txt", "text/plain"}, {".pdf", "application/pdf"}, // add more file types }; var ext = Path.GetExtension(path).ToLowerInvariant(); return types.ContainsKey(ext) ? types[ext] : "application/octet-stream"; } } /// /// 描 述:文件下载类 /// public class FileDownUtil { public FileDownUtil() { } // /// // /// 参数为虚拟路径 // /// // public static string FileNameExtension(string FileName) // { // return Path.GetExtension(MapPathFile(FileName)); // } /// /// 获取物理地址 /// public static string MapPathFile(string FileName) { return ConfigHelper.GetValue("baseDir"); //return Directory.GetCurrentDirectory(); } // /// // /// 验证文件是否存在 // /// // /// // /// // public static bool FileExists(string FileName) // { // string destFileName = FileName; // if (File.Exists(destFileName)) // { // return true; // } // else // { // return false; // } // } // /// // /// 普通下载 // /// // /// 文件虚拟路径 // /// /// 返回客户端名称 // public static void DownLoadold(string FileName, string name) // { // string destFileName = 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(name, 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(); // } // } // /// // /// 分块下载 // /// // /// 文件虚拟路径 // 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(FileName, 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(); // } // } // /// // /// 分块下载 // /// // /// 文件流 // /// 文件名 // public static void DownLoad(MemoryStream stream, string filename) // { // long chunkSize = 204800; //指定块大小 // byte[] buffer = new byte[chunkSize]; //建立一个200K的缓冲区 // long dataToRead = 0; //已读的字节数 // try // { // dataToRead = stream.Length; // //添加Http头 // HttpContext.Current.Response.ContentType = "application/octet-stream"; // HttpContext.Current.Response.AddHeader("Content-Disposition", "attachement;filename=" + filename); // 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(); // } // } /// /// 下载文件 /// /// 物理地址 public static void DownLoadnew(string filePath) { 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头 WebUtil.HttpContext.Response.ContentType = "application/octet-stream"; WebUtil.HttpContext.Response.Headers.Add("Content-Disposition", "attachement;filename=" + HttpUtility.UrlEncode(Path.GetFileName(filePath))); WebUtil.HttpContext.Response.Headers.Add("Content-Length", dataToRead.ToString()); while (dataToRead > 0) { if (WebUtil.HttpContext.Response.HasStarted) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); WebUtil.HttpContext.Response.Body.Write(buffer, 0, length); WebUtil.HttpContext.Response.Body.Flush(); WebUtil.HttpContext.Response.Clear(); dataToRead -= length; } else { dataToRead = -1; //防止client失去连接 } } } catch (Exception ex) { //WebUtil.HttpContext.Response.Body.Write("Error:" + ex.Message); } finally { if (stream != null) stream.Close(); WebUtil.HttpContext.Response.Body.Close(); } } // /// // /// 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 // /// // /// Page.Request对象 // /// Page.Response对象 // /// 下载文件名 // /// 带文件名下载路径 // /// 每秒允许下载的字节数 // /// 返回是否成功 // //--------------------------------------------------------------------- // //调用: // // string FullPath=Server.MapPath("count.txt"); // // ResponseFile(this.Request,this.Response,"count.txt",FullPath,100); // //--------------------------------------------------------------------- // public static bool ResponseFile(HttpContext _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; // } } }