ASP.net MVC 文件下载的几种方法(欢迎讨论) 在ASP.net MVC 中有几种下载文件的方法
前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不知道,但是还挺想了解的。
第一种:最简单的超链接方法,<a>标签的href直接指向目标文件地址,这样容易暴露地址造成盗链,这里就不说了
第二种:后台下载
在后台下载中又可以细分为几种下载方式
首先,在前台,我们需要一个<a>标签

<a href="~/Home/download">Click to get file</a>

Home为controller,download为action。
如果需要传一些参数,可以:

<a href="~/Home/download?id=1">Click to get file</a>

在后台:
(1)返回filestream

public FileStreamResult download()
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("~/Document/123.txt");//路径
return File(new FileStream(filePath, FileMode.Open), "text/plain",
fileName);
}

其中:“text/plain”是文件MIME类型
(2)返回file

public FileResult download()
{
string filePath = Server.MapPath("~/Document/123.txt");//路径
return File(filePath, "text/plain", "welcome.txt"); //welcome.txt是客户端保存的名字
}

(3)TransmitFile方法

  public void download()
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("~/Document/123.txt");//路径
FileInfo fileinfo = new FileInfo(filePath);
Response.Clear(); //清除缓冲区流中的所有内容输出
Response.ClearContent(); //清除缓冲区流中的所有内容输出
Response.ClearHeaders(); //清除缓冲区流中的所有头
Response.Buffer = true; //该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
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();
}

(4)Response分块下载

 public void download()
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("~/Document/123.txt");//路径 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists == true)
{
const long ChunkSize = ;//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 > && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, , Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, , lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}

<input>+ajax方法
要重点说说这个方法,ajax返回不了文件流,所以说用ajax调用上面任意一种后台方法都要出问题,下载不了文件。
所以,只能让后台返回所需下载文件的url地址,然后调用windows.location.href。
优点:ajax可以传好几个参数(当然以json形式),传100个都无所谓。你要是用<a href="网址?参数=值"></a>的方法传100得写死。。。(公司需求,至少要传100多个参数)
缺点:支持下载exe,rar,msi等类型文件。对于txt则会直接打开,慎用!对于其他不常用的类型文件则直接报错。
        所以我的建议是得到多个参数,通过数据库找到所有需要下载的文件然后压缩打包,然后返回url下载。(你要是一个一个给用户下,用户都疯了)
        !那么问题又来了,C#怎么用代码实现将本地的一些文件打包压缩到服务器目录下呢?这我不知道。
           因为你只是单纯的放在目录文件夹下没有用的,我们平时在服务器某目录下添加某一个文件都是右键,添加XXX项这样,这样才能真正的将文件放在服务器中。
           可是纯代码该怎么实现呢??
        * 可能的解决方法:先在项目目录下放一个空的rar文件或者没什么功能的exe,msi文件,然后在后台打包完一些文件后去替换它,不知道可行不。
            (1)首先清空原压缩包中的内容
            (2)将文件压缩到压缩包中
            (3)返回 XXX.rar
前端:

<input type="button" id="downloadbutton"/>

ajax:

$("#downloadbutton").click(function () {
$.ajax({
type: "GET",
url: "/Home/download",
data: { id: "" },
dataType:"json",
success: function (result) {
window.location.target = "_blank";
window.location.href = result;
}
})
})

后台:

public string download(int id)
{
string filePath = "Document/123.msi";//路径
return filePath;
}

这里,id是没有什么作用的,后台就别用什么server.Mappath了,肯定错。直接写服务器项目文件夹/文件名 即可。
 后记:如果有其他好的方法请务必留言,陆续更新。因为这个问题好多人都在网上问,我也试了好多方法。希望帮人帮己。

最新文章

  1. bs4 python解析html
  2. M6: 使用摄像头(CameraCaptureUI)
  3. 禁止ubuntu的super快捷键
  4. hdu 4240 Route Redundancy 最大流
  5. 局域网Internet的共享
  6. java 关于多态的一点总结
  7. Android开发之Activity(活动)
  8. 三篇编译libcurl,附下载 good
  9. A类型物料必须为装配拉式,供应子库为B仓
  10. git错集
  11. openwrt 加入nand flash的支持
  12. 大家好,我是一个热爱编程的大二在读生,今天来移植一下CSDN上的博客
  13. Eonasdan bootstrap datetimepicker 使用记录
  14. HDU2044:一只小蜜蜂...
  15. jquery实现点击复制到剪切板
  16. Android 8 AudioPolicy 初始化
  17. Python之部分基础知识点汇总
  18. 第二节:用PE安装Windows系统
  19. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
  20. 在windows上安装和启动Elasticseach、Kibana

热门文章

  1. java版本DbhelperMysql
  2. linux 的内核的作用和功能
  3. Mybatis 返回插入的主键
  4. docker探索-docker容器基本操作(五)
  5. spark streaming checkpoint
  6. WPF重写Button样式
  7. PostgreSQL存储过程&lt;转&gt;
  8. python-opencv boundingRect使用注意
  9. 利用python的KMeans和PCA包实现聚类算法
  10. 前端CSS - 相对定位,绝对定位,固定定位