.net mvc项目 文件下载的几种方式

已被阅读 705 次 | 文章分类:csharp | 2021-11-25 00:31

本文整理了.net mvc项目中五种文件下载的方式

1 a标签链接

a标签链接直接指向文件地址,但前提是文件地址是你自己服务器下载地址,如果直接链接到其他站点,比如流行软件下载地址,该行为便属于盗链嫌疑了

2 直接返回文件

直接通过文件地址返回

                                            
// 返回file
public FileResult DownloadFile()
    {
    // 路径
    string filePath = Server.MapPath("~/Content/data/2.exe");
    // 2.exe是客户端保存的名字
    return File(filePath, "text/plain", "2.exe"); 
}
                                            
                                        

3 文件流方式

将文件转为文件流,再通过File返回

                                            
// 返回filestream
public FileStreamResult DownloadFilestream()
{
    // 路径
    string filePath = Server.MapPath("~/Content/data/1.zip");
    // 1.zip 是客户端保存的名字
    return File(new FileStream(filePath, FileMode.Open), "text/plain", "1.zip");
}
                                            
                                        

4 TransmitFile方式

                                            
 //
        // 摘要:
        //     将指定文件写入 HTTP 响应输出流(不在内存中进行缓冲)。
        //
        // 参数:
        //   filename:
        //     要写入 HTTP 输出流的文件名。
        //
        // 异常:
        //   T:System.NotImplementedException:
        //     始终。
        public virtual void TransmitFile(string filename);// TransmitFile方法
                                            
                                        

代码如下:

                                            
// TransmitFile方法
public void TransmitFile()
        {
    string filePath = Server.MapPath("~/Content/data/2.exe");//路径
    FileInfo fileinfo = new FileInfo(filePath);
    Response.Clear();         // 清除缓冲区流中的所有内容输出
    Response.ClearContent();  // 清除缓冲区流中的所有内容输出
    Response.ClearHeaders();  // 清除缓冲区流中的所有头
    Response.Buffer = true;   // 该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
    Response.AddHeader("Content-Disposition", "attachment;filename=" + "2.exe");
    Response.AddHeader("Content-Length",fileinfo.Length.ToString());
    Response.AddHeader("Content-Transfer-Encoding", "binary");
    Response.ContentType = "application/unknow";  // 获取或设置输出流的 HTTP MIME 类型
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); // 获取或设置输出流的 HTTP 字符集
    Response.TransmitFile(filePath);
    Response.End();
}
                                            
                                        

5 分块下载

                                            
// Response分块下载
public void ResponseFk()
    {
        string fileName = "2.exe";// 客户端保存的文件名
        string filePath = Server.MapPath("~/Content/data/2.exe");// 路径

        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();
        }
    }
}
                                            
                                        

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号