首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET WebAPI中返回文件(FileContentResult)

如何在ASP.NET WebAPI中返回文件(FileContentResult)
EN

Stack Overflow用户
提问于 2014-09-25 20:37:01
回答 6查看 349.1K关注 0票数 203

在常规的MVC控制器中,我们可以使用FileContentResult输出pdf。

代码语言:javascript
复制
public FileContentResult Test(TestViewModel vm)
{
    var stream = new MemoryStream();
    //... add content to the stream.

    return File(stream.GetBuffer(), "application/pdf", "test.pdf");
}

但是我们如何将其更改为ApiController呢?

代码语言:javascript
复制
[HttpPost]
public IHttpActionResult Test(TestViewModel vm)
{
     //...
     return Ok(pdfOutput);
}

以下是我尝试过的方法,但似乎不起作用。

代码语言:javascript
复制
[HttpGet]
public IHttpActionResult Test()
{
    var stream = new MemoryStream();
    //...
    var content = new StreamContent(stream);
    content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    content.Headers.ContentLength = stream.GetBuffer().Length;
    return Ok(content);            
}

浏览器中显示的返回结果为:

代码语言:javascript
复制
{"Headers":[{"Key":"Content-Type","Value":["application/pdf"]},{"Key":"Content-Length","Value":["152844"]}]}

在SO上有一个类似的帖子:Returning binary file from controller in ASP.NET Web API 。它讨论了如何输出现有的文件。但我不能让它在流中工作。

有什么建议吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-09-25 22:34:46

我可以让它与ByteArrayContent一起工作,而不是将StreamContent作为Content返回。

代码语言:javascript
复制
[HttpGet]
public HttpResponseMessage Generate()
{
    var stream = new MemoryStream();
    // processing the stream.

    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new ByteArrayContent(stream.ToArray())
    };
    result.Content.Headers.ContentDisposition =
        new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = "CertificationCard.pdf"
    };
    result.Content.Headers.ContentType =
        new MediaTypeHeaderValue("application/octet-stream");

    return result;
}
票数 220
EN

Stack Overflow用户

发布于 2016-05-26 15:41:47

如果你想返回IHttpActionResult,你可以这样做:

代码语言:javascript
复制
[HttpGet]
public IHttpActionResult Test()
{
    var stream = new MemoryStream();

    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new ByteArrayContent(stream.GetBuffer())
    };
    result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = "test.pdf"
    };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

    var response = ResponseMessage(result);

    return response;
}
票数 107
EN

Stack Overflow用户

发布于 2014-09-25 22:19:41

This问题帮了我大忙。

所以,试试这个:

控制器代码:

代码语言:javascript
复制
[HttpGet]
public HttpResponseMessage Test()
{
    var path = System.Web.HttpContext.Current.Server.MapPath("~/Content/test.docx");;
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    var stream = new FileStream(path, FileMode.Open);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(path);
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    result.Content.Headers.ContentLength = stream.Length;
    return result;          
}

查看Html标记(带有单击事件和简单的url):

代码语言:javascript
复制
<script type="text/javascript">
    $(document).ready(function () {
        $("#btn").click(function () {
            // httproute = "" - using this to construct proper web api links.
            window.location.href = "@Url.Action("GetFile", "Data", new { httproute = "" })";
        });
    });
</script>


<button id="btn">
    Button text
</button>

<a href=" @Url.Action("GetFile", "Data", new { httproute = "" }) ">Data</a>
票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26038856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档