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
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.