龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

Asp.net实现MVC处理文件的上传下载功能实例教程_C#教程(2)

时间:2014-08-30 15:22来源:网络整理 作者:网络 点击:
分享到:
FileContent域是image数据类型,用于存储以二进制数据形成的文件,而Index Action改为: public ActionResult Index() { foreach (string upload in Request.Files) { if (!Request.File

FileContent域是image数据类型,用于存储以二进制数据形成的文件,而Index Action改为:

public ActionResult Index() 
{ 
 foreach (string upload in Request.Files) 
 { 
  if (!Request.Files[upload].HasFile()) continue; 
  string mimeType = Request.Files[upload].ContentType; 
  Stream fileStream = Request.Files[upload].InputStream; 
  string fileName = Path.GetFileName(Request.Files[upload].FileName); 
  int fileLength = Request.Files[upload].ContentLength; 
  byte[] fileData = new byte[fileLength]; 
  fileStream.Read(fileData, 0, fileLength); 
  const string connect = @"Server=.\SQLExpress;Database=FileTest;Trusted_Connection=True;"; 
  using (var conn = new SqlConnection(connect)) 
  { 
   var qry = "INSERT INTO FileStore (FileContent, MimeType, FileName) VALUES (@FileContent, @MimeType, @FileName)"; 
   var cmd = new SqlCommand(qry, conn); 
   cmd.Parameters.AddWithValue("@FileContent", fileData); 
   cmd.Parameters.AddWithValue("@MimeType", mimeType); 
   cmd.Parameters.AddWithValue("@FileName", fileName); 
   conn.Open(); 
   cmd.ExecuteNonQuery(); 
  } 
 } 
 return View(); 
}

修改后的代码会以循环的方式遍历Web页面中所有的上传文件,并检查<input type=”file”>中是否已经加入文件,然后,从文件中提取出3个信息:文件名,MIME类型(文件的类型),HTTP Request中的二进制流。二进制数据被转换为byte数组,并以image数据类型存入数据库。MIME类型和文件名对于用户从数据库中提取文件来说非常重要。

4.将数据库中的文件返回给用户:

你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式。每当你需要以流的方式将文件送到浏览器中,你都的使用到File()方法的重载(而不是使用我们先前一直使用的View()方法),对于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> 
精彩图集

赞助商链接