web-dev-qa-db-ja.com

ASP.NET 5 Web APIからファイルを返す

私の前の質問: ASP.net 5 web apiからファイルを返す方法

Web API POST request。からの応答としてファイルを返そうとしています。

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をテストクライアントとして使用しています。

ありがとう

10
Joonas Püüa

他の投稿の私の答えを参照してください: 応答としてファイルを返す

参考までに、これはあなたのニーズに合っていると思います:

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;                                
}
20
Ian Auty

私はちょうどこの問題を抱えていて、解決策を見つけました。ファイルへの絶対パスがある限り、PhysicalFileResultを返し、ResponseContent-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を使用すると、バイトなどのすべての非同期ストリーミングがフレームワークによって処理されるという利点もあります。

11
Mark Rendle

おそらく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"
    };
}
2
Stewart_R