我ActionResult
回来了,File
但我也需要它有条件地返回一个Stream
.
我无法找到关于如何ActionResult
返回的文档Stream
.
这是我返回文件的代码:
return File(memoryStream,.... )
Run Code Online (Sandbox Code Playgroud)
如上所述,我需要返回一个Stream
.
aif*_*rfa 33
MemoryStream stream = someService.GetStream();
return new FileStreamResult(stream, "application/pdf")
Run Code Online (Sandbox Code Playgroud)
有一个动作叫另一个动作是一种设计气味.你应该避免它.简单地说,需要在服务层中的2个动作之间重用逻辑.然后从你的2个动作中调用这个逻辑.
例如:
public ActionResult Action1()
{
Stream stream = service.GetStream();
// ... do something with the stream and return a view for example
return View();
}
public ActionResult Action2()
{
Stream stream = service.GetStream();
// let's return the stream to the client so that he could download it as file
return File(stream, "application/pdf");
}
Run Code Online (Sandbox Code Playgroud)
现在,您不再需要从第一个操作中调用第二个操作.
在问题中已经使用的最简单的方法来使用a Stream
作为Action Method的结果Controller
:使用的File
辅助方法Controller
。这将返回FileStreamResult
。
有几个重载可用Stream
。这两个重载都需要指定响应的MIME类型,该类型将作为Content-Type
响应的标头发出。如果您的情况对您的应用程序是未知的,则始终可以分别指定text/plain
或application/octet-stream
针对任意文本或二进制数据。一个重载另外需要第三个参数,该参数设置文件名以显示在浏览器的下载对话框中(通过Content-Disposition
标题控制)(如果适用)。
重载签名:
protected internal FileStreamResult File(
Stream fileStream,
string contentType
)
Run Code Online (Sandbox Code Playgroud)
和
protected internal virtual FileStreamResult File(
Stream fileStream,
string contentType,
string fileDownloadName
)
Run Code Online (Sandbox Code Playgroud)
用法示例:
return File(myStream, "application/pdf");
Run Code Online (Sandbox Code Playgroud)
要么
return File(myStream, "application/pdf", "billing-summary.pdf");
Run Code Online (Sandbox Code Playgroud)