2015-03-16 21 views
8

Ho questo metodo WebAPI, che accetta un oggetto personalizzato MyType come input e genera un PDF basato su quello. Il file PDF viene restituito come HttpResponseMessage. Si noti che ho specificare il nome del file sul response.Content.Headers.ContentDisposition.FileName:Come recuperare HttpResponseMessage FileName in JavaScript

ASP.NET WebAPI

[Route("")] 
public HttpResponseMessage Get([FromUri]MyType input) 
{ 
    var pdfContent = PdfGenerator.Generate(input); 

    var response = new HttpResponseMessage(HttpStatusCode.OK); 
    response.Content = pdfContent; 
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
    response.Content.Headers.ContentDisposition.FileName = "MyCustomFileName.pdf" 

    return response; 
} 

In AngularJS vado a prendere il file utilizzando FileSaver.js come questo:

$http.get("api/pdf/", { 
    params: { 
     "type": myObject 
    }, 
    responseType: 'arraybuffer' 
}).then(function (results) { 
    var data = results.data; 

    var file = new Blob([data], { type: 'application/pdf' }); 
    saveAs(file, 'filename.pdf'); 
}, function (results) { 
    console.log(results); 
}); 

funziona come eccettuato, ma Sto definendo il nome del file sia su WebAPI che in JavaScript. C'è un modo, che io possa recuperare il FileName definito in WebAPI nella variabile results in JavaScript?

risposta

6

La promessa restituito da metodi di $http sono passati come argomento un oggetto con le seguenti proprietà (ref):

  • dati - {string | oggetto} - Il corpo di risposta trasformato con le funzioni di trasformare.
  • stato - {numero} - codice di stato HTTP della risposta.
  • intestazioni - {function ([headerName])} - Funzione getter intestazione.
  • config - {Object} - L'oggetto di configurazione utilizzato per generare la richiesta.
  • statusText - {string} - Testo di stato HTTP della risposta.

Così results.headers('Content-Disposition') volontà ti dà il valore dell'intestazione Content-Disposition. Dovrai fare qualche banale parsing per arrivare al vero nome del file.

+1

Questa soluzione di cui sopra non funziona in Chrome poiché restituisce solo le intestazioni 'Cache-Control' e' Content-Type'. Ecco il mio post per maggiori dettagli http://stackoverflow.com/questions/39825590/web-api-is-not-returning-the-contentdisposition-filename –

+0

Il commento precedente è sbagliato perché, come è ovvio dalla risposta di la domanda collegata, il problema nella domanda non è Chrome, ma il fatto che la richiesta sia CORS e necessita di autorizzazione esplicita per accedere alle intestazioni. –

Problemi correlati