web-dev-qa-db-ja.com

ASP.net 5 WebAPIからファイルを返す方法

Asp.net5でwepapiを作成しました。Postリクエストのファイル応答を返そうとしています。しかし、ファイルの代わりに、応答は `のようになります

{
  "version": {
    "major": 1,
    "minor": 1,
    "build": -1,
    "revision": -1,
    "majorRevision": -1,
    "minorRevision": -1
  },
  "content": {
    "headers": [
      {
        "key": "Content-Disposition",
        "value": [
          "attachment; filename=test.pdf"
        ]
      },
      {
        "key": "Content-Type",
        "value": [
          "application/pdf"
        ]
      }
    ]
  },
  "statusCode": 200,
  "reasonPhrase": "OK",
  "headers": [],
  "requestMessage": null,
  "isSuccessStatusCode": true
}`

コード:

    public HttpResponseMessage 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));                 

                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(System.IO.File.ReadAllBytes(file))
                };
                result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = "test.pdf"
                };
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
                return result;

            }

        }
        catch (Exception ex)
        {
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return null;
        }
        Response.StatusCode = (int)HttpStatusCode.BadRequest;
        return null;

    }

JSONの代わりに実際のファイルを応答として返すにはどうすればよいですか?テストクライアントとしてPostmanを使用しています。

9
Joonas Püüa

httpResponseMessageの代わりにIActionResultを使用しました。そして、FileStreamResultを返し、それを機能させました。

新しい問題が発生しました。ファイルは、サーバーからのストリームで開いたファイルではありません。しかし、そのための新しい質問が作成されます。

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

ありがとう

4
Joonas Püüa

これは「低レベル」のHTTPアプローチであり、ASP.NETWebAPIまたはASP.NETMVCの両方で機能するはずです。

[HttpGet]
public HttpResponseMessage Download()
{
  var fs = new FileStream(myfileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, 32768, true);
  var response = new HttpResponseMessage {
    Content = new StreamContent(fs);
  }
  response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
  response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
  return response;
}
2
MoSad