web-dev-qa-db-fra.com

Fichier csv de retour de l'API Web

J'ai besoin d'obtenir un fichier csv à partir du contrôleur web api. Je ne parviens pas à afficher la boîte de dialogue "Enregistrer sous". Seule la sortie texte apparaît sur la page. J'ai essayé les deux, en appelant Exporter depuis jquery et aussi du vieux HTML simple

Manette:

[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: a ajouté cette ligne:

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

ne fonctionne toujours pas

Je l'appelle comme ça:

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

et aussi essayé comme ça:

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

Toujours pas de boîte Enregistrer sous

13
ShaneKm

Je ne sais pas si c'est le bon protocole mais c'est comme ça que je le faisais avant. Vous avez donc une page Web à partir de laquelle vous invoquerez une API qui répondra avec le fichier et elle devrait être gérée par la boîte de dialogue Enregistrer sous du navigateur.

Le 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'action:

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

Cela fonctionne pour moi dans les deux Chrome et Firefox derniers.

34
lbrahim