[英]Return file from ASP.NET 5 Web API
我之前的问题: 如何从ASP.net 5 web api返回文件
我试图返回一个文件作为Web API POST请求的响应。
我正在使用dnx451框架和rc1-final构建。 控制器方法:
[HttpPost("")]
public ActionResult Post([FromBody]DocumentViewModel vm)
{
try
{
if (ModelState.IsValid)
{
var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name);
var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields);
var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content));
FileStream stream = new FileStream(file,FileMode.Open);
return File(stream, "application/pdf", "test.pdf");
}
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return null;
}
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return null;
}
结果我得到一个名为“response”的文件。 将其保存为pdf后,我尝试打开它,它说它已损坏。 希望您能够帮助我。 我使用Postman作为测试客户端。
谢谢
请在另一篇文章中查看我的答案: 返回文件作为回复
作为参考,我认为这符合您的需求:
public FileResult TestDownload()
{
HttpContext.Response.ContentType = "application/pdf";
FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes("YOUR PATH TO PDF"), "application/pdf")
{
FileDownloadName = "test.pdf"
};
return result;
}
我刚遇到这个问题并找到了解决方案。 只要您拥有文件的绝对路径,就可以返回PhysicalFileResult
并在Response
上显式设置Content-Disposition
标头,如下所示:
[HttpGet("{key}")]
public IActionResult Get(string key)
{
var file = _files.GetPath(key);
var result = PhysicalFile(file.Path, "text/text");
Response.Headers["Content-Disposition"] = new ContentDispositionHeaderValue("attachment")
{
FileName = file.Name
}.ToString();
return result;
}
使用PhysicalFile
还有一个优点,即框架可以处理所有字节的异步流等。
考虑使用FileStreamResult
操作结果可能更好。
这具有不需要将整个文件内容保存在存储器中的优点,根据文件的大小,流量等等可能非常容易导致规模问题。
像这样的东西:
[HttpGet]
public FileStreamResult DownloadFile()
{
var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name);
var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields);
var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content));
var stream = new FileStream(file,FileMode.Open);
return new FileStreamResult(stream, "application/pdf")
{
FileDownloadName = "test.pdf"
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.