MVC3 - 如何输出要下载的文件而不先将其保存在服务器上?

Ext*_*kun 8 asp.net-mvc-3

在PHP中,可以通过使用正确的标头回显文件来将文件返回到浏览器.您不需要先在服务器上保存它的副本.

因此,假设我有一堆数据,我希望作为excel文件返回 - 在使用OpenXML创建数据结构后,如何将文件提供给用户而不先将其保存在服务器上?

Ant*_*een 11

实际上它非常简单.在您的控制器中,您可以执行以下操作:

    public ActionResult GetMyFile()
    { 
        //dynamically generate a file
        System.IO.MemoryStream ms;
        ms = GenerateFile(); // Some function to return a memorystream object

        // return the file
        return File(ms.ToArray(), "filename.pdf");
    }
Run Code Online (Sandbox Code Playgroud)

将向用户显示一个对话框,询问他们是否要打开文件或保存文件.

  • 实际上,它甚至比这更简单.你不需要调用`.ToArray()`因为`File`支持[带流的重载](http://msdn.microsoft.com/en-us/library/dd493017.aspx). (2认同)

Gid*_*sey 9

您的数据写入到一个流和从控制器的操作方法在返回它FileStreamResult通过设置FileStream,ContentType和FileDownloadName属性.

    [HttpGet]
    public FileStreamResult MyFile()
    {
        var fileStreamResult = new FileStreamResult (GetMyContentAsStream(), "my/content-type-here");
        fileStreamResult.FileDownloadName = "my-file-download-name.here";

        return fileStreamResult ;
    }
Run Code Online (Sandbox Code Playgroud)

更新: 执行此操作的捷径是使用Controller.File()方法.

    [HttpGet]
    public FileStreamResult MyFile()
    {
        return File(GetMyContentAsStream(), "my/content-type-here");
    }
Run Code Online (Sandbox Code Playgroud)