私の前の質問: 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をテストクライアントとして使用しています。
ありがとう
他の投稿の私の答えを参照してください: 応答としてファイルを返す
参考までに、これはあなたのニーズに合っていると思います:
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"
};
}