你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式。每当你需要以流的方式将文件送到浏览器中,你都的使用到File()方法的重载(对于File()方法有3类返回类型:FilePathResult,FileContentResult和FileStreamResult,第一种类型用于直接从磁盘返回文件;第二种类型用于将byte数组返回客户端;而第三种方式将已经生成并打开的流对象的内容返回客户端。

如果你还记得的话,我们将上传的文件存入了数据库,并以byte数组的形式存入FileContent域内.而当需要提取时,它仍然会以一个byte数组进行提取,这意味着我们使用返回FileContentResult的File()重载,如果我们想让提取的文件名更有意义,我们使用接受3个参数的重载,三个参数是:byte数组,MIME类型,文件名:

public FileContentResult GetFile(int id)
{
SqlDataReader rdr; byte[] fileContent = null;
string mimeType = "";string fileName = "";
const string connect = @"Server=.\SQLExpress;Database=FileTest;Trusted_Connection=True;"; using (var conn = new SqlConnection(connect))
{
var qry = "SELECT FileContent, MimeType, FileName FROM FileStore WHERE ID = @ID";
var cmd = new SqlCommand(qry, conn);
cmd.Parameters.AddWithValue("@ID", id);
conn.Open();
rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
fileContent = (byte[])rdr["FileContent"];
mimeType = rdr["MimeType"].ToString();
fileName = rdr["FileName"].ToString();
}
}
return File(fileContent, mimeType, fileName);
}

在View中最简单的使用来使用这个Action只需提供一个超链接:

<a href="/GetFile/1">Click to get file</a>

如果在数据库中存储的图片是图片类型,和使用超链接不同的是,我们通过指向Controller action的一个带有src属性的<image>标签来获取:

<img src="/GetFile/1" alt="My Image" />

下面再让我们来看看使用FilePathResult(用于从硬盘提取文件)是多简单的事:

public FilePathResult GetFileFromDisk()
{
string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/";
string fileName = "test.txt";
return File(path + fileName, "text/plain", "test.txt");
}

而这也可以用过超链接提取:

<a href="/GetFileFromDisk">Click to get file</a>

而最后一个选择FileStreamResult也可以从磁盘中提取文件:

public FileStreamResult StreamFileFromDisk()
{
string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/";
string fileName = "test.txt";
return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName);
}

FilePathResult和FileStreamResult的区别是什么?我们又该如何取舍呢?主要的区别是FilePathResult使用HttpResponse.TransmitFile来将文件写入Http输出流。这个方法并不会在服务器内存中进行缓冲,所以这对于发送大文件是一个不错的选择。他们的区别很像DataReader和DataSet的区别。于此同时, TransmitFile还有一个bug,这可能导致文件传到客户端一半就停了,甚至无法传送。而FileStreamResult在这方面就很棒了。比如说:返回Asp.net Chart 控件在内存中生成的图表图片,而这并不需要将图片存到磁盘中.

最新文章

  1. C# 利用性能计数器监控网络状态
  2. Mysql 备份
  3. UDS(ISO14229-2006) 汉译(No.4 术语和缩写)
  4. TestNG
  5. 背水一战 Windows 10 (4) - UI: 多窗口
  6. Delphi中限制文本框(TEdit)只能输入数字
  7. js-数据类型
  8. linux命令行抓取网页快照-(xvfb+CutyCapt)
  9. MyBatis中的大于、小于、like等符号写法
  10. 支持多用户web终端实现及安全保障(nodejs)
  11. js和native交互方法浅析
  12. Android 简单实现控件的拖动
  13. 华为ENSP进行evn实验,尚不完整,但已经有RT1、RT2、RT3、RT4了
  14. 关于session,cookie,Cache
  15. vmware中的linux虚拟机配置以nat模式上网,并用xshell连接该虚拟机
  16. 机器学习基石笔记:10 Logistic Regression
  17. 《linux内核设计与分析》内核模块编程
  18. RestTemplate的异步使用
  19. reids遇到问题
  20. 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法

热门文章

  1. 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
  2. 解析Monte-Carlo算法(基本原理,理论基础,应用实践)
  3. Jenkins持续集成环境搭建
  4. .NETFramework:ConfigurationManager
  5. bash 实现菜单
  6. saltstack其他运行模式
  7. leetcode Word Break-单词划分
  8. git pull 冲突
  9. WPF ChangePropertyAction中TargetName和TargetObject的区别
  10. 在Elasticsearch6.X中如何实现去重