作者:伊倓 | 来源:互联网 | 2023-09-24 10:20
ASP.NETMVC定义了三个具体的FileResult,分别是FileContentResult、FilePathResult和FileStreamResult,接下来我们对它们进行单独介绍
ASP.NET MVC定义了三个具体的FileResult,分别是FileContentResult、FilePathResult和FileStreamResult,接下来我们对它们进行单独介绍。
二、FileContentResult
是针对文件内容创建的FileResult。如下面的代码片断所示,FileContentResult具有一个字节数组类型的只读属性FileContents表示响应文件的内容,该属性在构造函数中指定。FileContentResult针对文件内容的响应实现也很简单,从如下所示的WriteFile方法定义可以看出,它只是调用当前HttpResponse的OutputStream属性的Write方法直接将表示文件内容的字节数组写入响应输出流。
public class FileContentResult : FileResult
{
public byte[] FileContents { get; }
public FileContentResult(byte[] fileContents, string contentType) ;
protected override void WriteFile(HttpResponseBase response)
{
response.OutputStream.Write(this.FileContents, , this.FileContents.Length);
}
public abstract class Controller : ControllerBase, ...
{
// 其他成员
protected FileContentResult File(byte[] fileContents, string contentType);
protected virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName);
}
抽象类Controller中定义了如上两个File重载根据指定的字节数组、媒体类型和下载文件名(可选)生成相应的FileContentResult。由于FileContentResult是根据字节数组创建的,当我们需要动态生成响应文件内容(而不是从物理文件中读取)时,FileContentResult是一个不错的选择。
三、FilePathResult
从名称可以看出,是一个根据物理文件路径创建FileResult。如下面的代码片断所示,表示响应文件的路径通过只读属性FileName表示,该属性在构造函数中被初始化。在实现的WriteFile方法中,FilePathResult直接将文件路径作为参数调用当前HttpResponse的TransmitFile实现了针对文件内容的响应。抽象类Controller同样定义了两个File方法重载来根据文件路径创建相应的FilePathResult。
public class FilePathResult : FileResult
{
public string FileName { get; }
public FilePathResult(string fileName, string contentType);
protected override void WriteFile(HttpResponseBase response)
{
response.TransmitFile(this.FileName);
}
public abstract class Controller : ControllerBase, ...
{
//其他成员
protected FilePathResult File(string fileName, string contentType);
protected virtual FilePathResult File(string fileName, string contentType, string fileDownloadName);
}
四、FileStreamResult
允许我们通过一个用于读取文件内容的流来创建FileResult。如下面的代码片断所示,读取文件流通过只读属性FileStream表示,该属性在构造函数中被初始化。在实现的WriteFile方法中,FileStreamResult通过指定的文件流读取文件内容,并最终调用当前HttpResponse的OutputStream属性的Write方法将读取的内容写入当前HTTP响应的输出流中。抽象类Controller中同样定义了两个File方法重载根据文件读取流创建相应的FileStreamResult。
public class FileStreamResult : FileResult
{
public Stream FileStream { get; }
public FileStreamResult(Stream fileStream, string contentType);
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (this.FileStream)
{
byte[] buffer = new byte[0x1000];
while (true)
{
int count = this.FileStream.Read(buffer, , 0x1000);
if (count == )
{
return;
}
outputStream.Write(buffer, , count);
}
}
}
}
public abstract class Controller : ControllerBase, ...
{
//其他成员
protected FileStreamResult File(Stream fileStream, string contentType);
protected virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName);
}
五、实例演示:通过FileResult发布图片
为了让读者对FileResult具有更加深刻地认识,我们通过一个实例来演示如何通过FileResult来对外发布图片。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们在根目录下添加一个名为images的子目录来存放发布的.jpg图片,然后我们定义如下一个HomeController。