2016-01-18 10 views
9

Meine vorherige Frage: How to return file from ASP.net 5 web apiDatei von ASP.NET 5 Web API

ich versuche, eine Datei als die Antwort von Web-API-POST-Anfrage zurück.

Ich benutze dnx451 Framework und rc1-final build. Controller-Methode:

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

} 

Als Ergebnis bekomme ich eine Datei mit dem Namen "Antwort". Nachdem ich es als pdf gespeichert habe, versuche ich es zu öffnen und es wird angezeigt, dass es beschädigt ist. Hoffe, du kannst mir helfen. Ich benutze Postman als Testclient.

Dank

+0

Wenn Sie das Debuggen nicht erreicht der Code die 'Return File()' Linie? Was sind die Inhalte und Header in der Antwort erhalten? – David

+0

Funktioniert Ihre 'Helper.GeneratePdf()' Zeile korrekt? Was ist der Wert von 'Datei'? Kann die Datei geöffnet werden, und haben Sie die generierte Datei überprüft, bevor Sie sie an den Browser gesendet haben? –

+0

Ja, das PDF wird generiert, und ich kann die generierte PDF-Datei aus dem Datei-Explorer öffnen und es ist in Ordnung. –

Antwort

18

Bitte meine Antwort im anderen Beitrag sehen: Return file as response

Als Referenz Ich denke, das Ihren Bedürfnissen entspricht:

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;         
} 
+0

Das Ergebnis ist immer noch das gleiche. Die Antwort gibt die Datei namens "response" zurück. Wenn ich es in somthing.pdf umbenenne und versuche, es zu öffnen - es ist immer noch beschädigt. –

+0

Ich habe diesen Code lokal mit einer lokalen PDF-Datei getestet und die Datei wurde ordnungsgemäß heruntergeladen und ich konnte sie öffnen. Ist der PDF-Pfad lokal für Ihren Computer oder generieren Sie ihn dynamisch oder so? Wo ich 'IHRE PATH TO PDF' angegeben habe, müssen Sie auch die Erweiterung einschließen. –

+0

grundsätzlich erstelle ich es aber atm Ich teste mit lokalen Datei. Ja .pdf ist enthalten. Ich denke, es könnte PostMan Problem sein. –

9

ich dieses Problem nur gehabt haben und fand ein Lösung. Solange Sie einen absoluten Pfad zu Ihrer Datei haben, dann können Sie eine PhysicalFileResult zurückkehren und sich ausdrücklich Content-Disposition Header auf der Response gesetzt, etwa so:

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

Mit PhysicalFile hat auch den Vorteil, dass alle die asynchrone Streaming Bytes usw. wird durch das Framework besorgt.

3

Es ist vielleicht besser, die Verwendung des FileStreamResult Aktionsergebnisses zu berücksichtigen.

Dies hat den Vorteil, dass nicht der gesamte Dateiinhalt im Speicher gehalten werden muss, was je nach Dateigröße, Traffic-Level usw. sehr leicht zu Skalierungsproblemen führen kann.

Etwa so:

[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" 
    }; 
} 
+0

Isnt FileStreamResult von MVC? – Tobias