从 ASP.NET 5 Web API 返回文件

本文关键字:API 返回 文件 Web ASP NET | 更新日期: 2023-09-27 18:30:46

我之前的问题:如何从 5 个 web api ASP.net 返回文件

我正在尝试返回一个文件作为来自 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;
}

结果我得到了一个名为"响应"的文件。将其保存为pdf后,我尝试打开它,它说它已损坏。希望你能帮助我。我正在使用邮递员作为测试客户端。

谢谢

从 ASP.NET 5 Web API 返回文件

请在另一篇文章中查看我的回答:返回文件作为响应

作为参考,我认为这符合您的需求:

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"
    };
}