2016-01-18 1 views
9

mia precedente domanda: How to return file from ASP.net 5 web apiRitorno da ASP.NET 5 Web API

Sto cercando di restituire un file come la risposta da richiesta Web API POST.

Utilizzo il framework dnx451 e il build rc1-final. Metodo controller:

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

} 

Come risultato ottengo un file con il nome "risposta". Dopo averlo salvato come pdf, provo ad aprirlo e dice che è danneggiato. Spero che tu possa aiutarmi. Sto usando Postman come client di test.

Grazie

+0

Durante il debug questo, non il codice raggiunge il 'ritorno file)' linea (? Qual è il contenuto e le intestazioni ricevute nella risposta? – David

+0

La tua riga 'Helper.GeneratePdf()' sta funzionando correttamente? Qual è il valore di 'file'? Il file può essere aperto e hai ispezionato il file generato prima di inviarlo al browser? –

+0

sì, il pdf viene generato e posso aprire il file pdf generato da File explorer e va bene. –

risposta

18

Si prega di vedere la mia risposta in altri post: Return file as response

Per avere un riferimento, credo che questo si adatta alle vostre esigenze:

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

Il risultato è sempre lo stesso. La risposta restituisce il file chiamato "risposta". se lo rinominano in somthing.pdf e provo ad aprirlo, è ancora danneggiato. –

+0

Ho testato quel codice localmente con un pdf locale e il file scaricato correttamente e ho potuto aprirlo. Il percorso pdf è locale alla tua macchina o lo stai generando dinamicamente o qualcosa del genere? Dove ho indicato "IL TUO PERCORSO IN PDF", devi includere anche l'estensione. –

+0

fondamentalmente lo sto creando ma atm sto testando con file locale. si .pdf è incluso. Penso che potrebbe essere il problema di PostMan. –

9

Ho appena avuto questo problema e abbiamo trovato un soluzione. Finché si dispone di un percorso assoluto per il file, quindi è possibile restituire un PhysicalFileResult e impostare in modo esplicito l'intestazione Content-Disposition sul Response, in questo modo:

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

Utilizzando PhysicalFile ha anche il vantaggio che tutti lo streaming asincrono di byte e così via sono curati dal framework.

3

È forse meglio considerare l'utilizzo del risultato dell'azione FileStreamResult.

Questo ha il vantaggio di non richiedere che l'intero contenuto del file venga tenuto in memoria che, a seconda della dimensione del file, del livello di traffico, ecc. Potrebbe facilmente portare a problemi di scala.

Qualcosa di simile a questo:

[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 di MVC? – Tobias