1. ホーム
  2. c#

[解決済み】ASP.NET WebAPIでファイル(FileContentResult)を返す方法

2022-04-13 23:52:05

質問

通常のMVCコントローラでは、pdfを出力するために FileContentResult .

public FileContentResult Test(TestViewModel vm)
{
    var stream = new MemoryStream();
    //... add content to the stream.

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

しかし、これをどうすれば ApiController ?

[HttpPost]
public IHttpActionResult Test(TestViewModel vm)
{
     //...
     return Ok(pdfOutput);
}


以下は私が試したものですが、うまくいかないようです。

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

ブラウザに表示される返送結果は

{"Headers":[{"Key":"Content-Type","Value":["application/pdf"]},{"Key":"Content-Length","Value":["152844"]}]}

そして、SOにも同様の投稿があります。 ASP.NET Web API でコントローラからバイナリファイルを取得する . 既存のファイルを出力することについて書かれています。しかし、私はそれをストリームで動作させることができませんでした。

何か提案はありますか?

解決方法は?

を返す代わりに StreamContentContent で動作させることができます。 ByteArrayContent .

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