Asp.net-Web-Api

如何從 ASP.net 5 web api 返回文件

  • July 30, 2019

在 asp.net 5 中創建了 wep api。我正在嘗試返回 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 作為測試客戶端。

使用 IActionResult 而不是 HttpResponseMessage。並返回 FileStreamResult,並讓它工作。

遇到了一個新問題,該文件不是我使用來自伺服器的流打開的文件。但會為此提出一個新問題。

繼續:從 ASP.NET 5 Web API 返回文件

謝謝

這是“低級”HTTP 方法,應該適用於 ASP.NET WebAPI 或 ASP.NET MVC。

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

引用自:https://stackoverflow.com/questions/34853072