ASP.NET MVC FileResult到磁盘上的文件

Dir*_*oer 4 c# asp.net asp.net-mvc file

出于模拟目的,我想将FileResult输出到磁盘上的实际文件中.

有没有办法获取FileResult的内容并将其写入文件?FileResult上的暴露属性有点偏差.

我正在寻找类似的东西:

var file_result = controller.CsvExport();

file_result.ToFile(@"C:\temp.csv");

public static void WriteToFile(this FileResult fileResult, string fileName)
{
    // what to implement here?
    [...]
}
Run Code Online (Sandbox Code Playgroud)

mas*_*son 10

当您返回FileResult时,请使用以下子类之一...

然后你可以通过...访问该文件

  • FileContentResult.FileContents byte []
  • FilePathResult.FileName字符串/路径
  • FileStreamResult.FileStream流

或者在扩展方法中,检查它是哪个子类型,将其转换为子类型,获取文件路径/内容/流并将其写入输出文件.

public static void ToFile(this FileResult fileResult, string fileName)
{
    if (fileResult is FileContentResult)
    {
        File.WriteAllBytes(fileName, ((FileContentResult)fileResult).FileContents);
    }
    else if (fileResult is FilePathResult)
    {
        File.Copy(((FilePathResult)fileResult).FileName, fileName, true); //overwrite file if it already exists
    }
    else if (fileResult is FileStreamResult)
    {
        //from http://stackoverflow.com/questions/411592/how-do-i-save-a-stream-to-a-file-in-c
        using (var fileStream = File.Create(filename))
        {
            var fileStreamResult = (FileStreamResult)fileResult;
            fileStreamResult.FileStream.Seek(0, SeekOrigin.Begin);
            fileStreamResult.FileStream.CopyTo(fileStream);
            fileStreamResult.FileStream.Seek(0, SeekOrigin.Begin); //reset position to beginning. If there's any chance the FileResult will be used by a future method, this will ensure it gets left in a usable state - Suggestion by Steven Liekens
        }
    }
    else
    {
        throw new ArgumentException("Unsupported FileResult type");
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果我是你,我会把它叫做,ToFileOnDisk而不是ToFile让它更清楚输出的位置.