zoukankan      html  css  js  c++  java
  • MVC FileResult

    你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式。每当你需要以流的方式将文件送到浏览器中,你都的使用到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 控件在内存中生成的图表图片,而这并不需要将图片存到磁盘中.

  • 相关阅读:
    msp430项目编程57
    msp430项目编程56
    msp430项目编程55
    msp430项目编程54
    msp430项目编程53
    msp430项目编程52
    msp430项目编程51
    msp430项目编程50
    msp430项目编程47
    msp430项目编程46
  • 原文地址:https://www.cnblogs.com/raohuagang/p/3903433.html
Copyright © 2011-2022 走看看