Comment télécharger un object de stream de mémoire via angularJS et webaAPI2

J’ai un projet dans lequel j’utilise NPOI pour générer un document Excel à partir de mon application Angular. J’ai les appels passés depuis mon service angular vers mon contrôleur webapi comme suit:

function exportReportToExcel(report) { return $http.post('reportlibrary/exportReport/', report, { }).then(function (response) { return response.data; }); }; 

Dans le contrôleur, je passe l’appel suivant

 [HttpPost] public HttpResponseMessage ExportReport([FromBody]DTOs.Report report) { try { IReportPersistenceManager manager = ContainerConfigurator.Instance.Resolve(); MemoryStream ms = new MemoryStream(); //we have to pass to the NOPI assemble file type as well as file name //since we only deal with excel for now we will set it but this could be configured later. long id = report.ReportId; ssortingng mimeType = "application/vnd.ms-excel"; ssortingng filename = "unknown"; manager.ExportDataToExcel(id, (name, mime) => { mimeType = mime; filename = name; return ms; }); ms.Position = 0; var response = new HttpResponseMessage(); response.Content = new ByteArrayContent(ms.ToArray()); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel"); return (response); } catch (Exception) { //error return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest); } } 

Il s’agit d’une migration depuis une application MVC. Auparavant, je pouvais renvoyer l’object à l’aide de System.IO.File pour renvoyer l’object ainsi que fermer le stream.

Je n’ai jamais fait cela avec Angular, mais d’après ce que j’ai lu, il apparaît que je peux déposer l’object memorystream dans un byteArray et le renvoyer au client.

Si c’est la bonne approche, comment résoudre cet object une fois qu’il revient au service angular et au contrôleur.

L’objective ici est de permettre à l’utilisateur de télécharger un rapport préalablement enregistré sous forme de fichier Excel.

Suis-je sur la bonne voie? Existe-t-il un moyen plus efficace de télécharger un object de stream de mémoire? Comment puis-je transmettre ce contexte au navigateur?

Merci d’avance

J’avais un problème similaire. J’ai résolu ce problème en modifiant le sharepoint terminaison pour prendre en charge GET et en appelant cette méthode à partir d’un nouvel onglet.

Donc, à partir de votre application angular, vous devez créer un nouvel onglet pointant sur le chemin qui appelle la méthode qui génère votre document. Vous pouvez ouvrir un onglet avec le code suivant:

 $window.open(path) 

Je pense que dans le lien suivant, vous pouvez avoir toutes les informations dont vous avez besoin:

Téléchargez le fichier à partir d’une méthode API Web ASP.NET à l’aide d’AngularJS

J’espère que ça aide.