2015-04-29 19 views
7

Ho bisogno di ottenere un file csv dal controller web api. Non riesco a visualizzare la finestra di dialogo "Salva con nome". Viene visualizzato solo l'output di testo sulla pagina. Ho provato entrambi, chiamando Esporta dal jquery e anche pianura vecchio htmlWeb API restituisce file csv

Controller:

[System.Web.Http.HttpGet] 
public HttpResponseMessage Export() 
{ 
    StringBuilder sb = new StringBuilder(); 
    IEnumerable<CustomerDiscount> list = this.subscriberRepository.GetSubscribers(); 

    foreach (CustomerDiscount item in list) 
    { 
     sb.AppendFormat(
      "{0};{1};{2};", 
      item.CustomerName, 
      item.CustomerNumber, 
      Environment.NewLine); 
    } 

    MemoryStream stream = new MemoryStream(); 
    StreamWriter writer = new StreamWriter(stream); 
    writer.Write(sb.ToString()); 
    writer.Flush(); 
    stream.Position = 0; 

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
    result.Content = new StreamContent(stream); 
    result.Content.Headers.ContentType = 
     new MediaTypeHeaderValue("text/csv"); 
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" }; 
    return result; 
} 

EDIT: aggiunto questa linea:

result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" }; 

ancora non funziona

I chiamalo così:

<a id="export" href="/Relay/Billing/Export" class="btn btn-primary">Export</a> 
.210

e anche provato in questo modo:

$("#export").click(function() { 
    $.post("/Relay/Billing/Export", { type: $("#discountType").val() }) 
     .done(function (data) { 
     }); 
}); 

Ancora nessuna casella Salva

+0

possibile duplicato di [Come impostare il download del nome del file nell'API Web MVC di ASP.NET] (http://stackoverflow.com/questions/12145390/how-to-set-downloading-file-name-in-asp- net-mvc-web-api) – CodeCaster

+1

Sono un po 'confuso. Un tipico * web-api * o * restful-services * restituisce JSON (o qualche tipo di serializzazione). Presumo che il tuo consumatore non sia un browser web? –

+0

Prova ad aggiungere questa riga prima di restituire il risultato: 'result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue (" attachment ") {FileName =" some.csv "};' – lbrahim

risposta

23

Non so se questo è il protocollo corretto, ma questo è come ho fatto prima. Quindi hai una pagina web da cui invocherai un'API che risponderà con il file e che dovrebbe essere gestita dal browser salva come finestra di dialogo.

Il codice HTML:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 

    <script type="text/javascript"> 
     function save() { 
      window.open('http://localhost:45719/api/home?id=12', '_blank', ''); 
     } 
    </script> 
</head> 
<body> 
    <a class="btn btn-primary" onclick="save()">Export</a> 
</body> 
</html> 

L'azione:

public HttpResponseMessage Get(int id) 
{ 
    MemoryStream stream = new MemoryStream(); 
    StreamWriter writer = new StreamWriter(stream); 
    writer.Write("Hello, World!"); 
    writer.Flush(); 
    stream.Position = 0; 

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
    result.Content = new StreamContent(stream); 
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); 
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" }; 
    return result; 
} 

Questo sta lavorando per me sia in Chrome e Firefox più recente.

+0

sta aprendo una nuova finestra del browser ma non si salva come finestra di dialogo – ShaneKm

+0

@ShaneKm Hai controllato se una delle impostazioni del tuo browser lo sta impedendo? Perché come detto sopra lo trovo in Chrome e Firefox come qualsiasi Salva come. – lbrahim

+0

funziona bene quando è il controller MVC. ma non per web api – ShaneKm