从ASP.NET 5 Web API返回文件

时间:2016-01-18 14:21:37

标签: c# asp.net-web-api asp.net-core

我之前的问题:How to return file from 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;

}

结果我收到一个名为"响应"的文件。将其保存为pdf后,我尝试打开它,它说它已损坏。希望您能够帮助我。我使用Postman作为测试客户端。

由于

3 个答案:

答案 0 :(得分:21)

请在另一篇文章中查看我的回答:Return file as response

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

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

答案 1 :(得分:11)

我刚遇到这个问题并找到了解决方案。只要您拥有文件的绝对路径,就可以返回PhysicalFileResult并在Content-Disposition上明确设置Response标题,如下所示:

[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还有一个优点,即框架可以处理所有字节的异步流等。

答案 2 :(得分:3)

考虑使用public interface ISectionService<out T> where T : ISectionView { } 操作结果可能更好。

这样做的好处是不需要将整个文件内容保存在内存中,这取决于文件的大小,流量等等,很容易导致规模问题。

这样的事情:

FileStreamResult