générer csv à partir de mvc, web api httpresponse et la recevoir par angularjs pour le télécharger
Je suis en train de générer un fichier CSV à partir de mon api web et de recevoir par angularjs. J'ai une API contrôleur comme ci-dessous:
[HttpPost]
public HttpResponseMessage GenerateCSV(FieldParameters fieldParams)
{
var output = new byte[] { };
if (fieldParams!= null)
{
using (var stream = new MemoryStream())
{
this.Serialize(fieldParams, stream);
stream.Flush();
output = stream.ToArray();
}
}
var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(output) };
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "Fields.csv"
};
return result;
}
Dans mon angularjs, j'ai ceci:
$scope.save = function () {
var csvInput= extractDetails();
//File is an angular resource. We call its save method here which
//accesses the api above which should return the content of csv
File.save(csvInput, function (content) {
console.log(content);
//only creates a csv file with "[object Object]" written in it
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/csv;charset=utf-8,\uFEFF' + encodeURI(content.Parameters);
hiddenElement.target = '_blank';
hiddenElement.download = 'myFile.csv';
hiddenElement.click();
});
};
Permet de dire par exemple, dans mon API contrôleur, le contenu de la réponse est
sortie
{byte[152]}
[0]: 83
[1]: 101
[2]: 44
[3]: 67
[4]: 10
Lorsque je reçois ce dans angularjs et j'ai mis la valeur de content
dans le journal de la console (chrome), c'est ce que j'obtiens:
{Paramètres: Tableau[1], $promesse: Objet, $résolu: true, $get: function, $économisez: fonction...}
0:"S"
1: "e"
2: ","
3: "C"
4: "↵"
$promesse: objet
$résolu: true`
- Pourquoi le
content
reçu dans le angularjs contenir des caractères
déjà au lieu d'un octet de tableau? - Comment puis-je contrôler la
content
de telle manière que je n'utilise que des
le csv des données et la suppression de$promise
et$resolved
? Pourquoi sont-ils inclus dans la première place? Comment les supprimer? - Quelle est la bonne façon de générer un fichier csv si ce que je fais est
de mal? 😐
OriginalL'auteur raberana | 2013-11-30
Vous devez vous connecter pour publier un commentaire.
Oublié de mettre à jour, mais j'ai maintenant trouvé un moyen de résoudre ce problème:
Il y aura deux API, un (POST) rappelez-vous que les données soient utilisées dans le traitement et un autre (OBTENIR) qui dispensera le fichier.
POST:
Dans AngularJs, n'oubliez pas le guid est retourné et la transmettre à une autre api:
Et voici le
generatefile
API contrôleur MVC:OBTENIR:
à l'aide de
location.href
entraîne le navigateur pour télécharger automatiquement le fichier, vous demandant de choisir d'enregistrer ou non.OriginalL'auteur raberana
Voici comment je le fais: (testé dans chrome)
Encas il aide quelqu'un d'autre.
Vous avez raison de l'appel asynchrone au serveur à l'aide de $ressources et les ancrages, cliquez sur ne pas faire un autre appel juste présente le fichier. Cela fonctionne très bien sans target=_blank. Il y a des restrictions de longueur de données sur une url, mais ses déterminé par le navigateur. Je crois que Chrome est de 2 mo. J'ai édité mon précédent réponse à inclure la reportsRepository
OriginalL'auteur itaylorweb