web-dev-qa-db-fra.com

comment télécharger un fichier Zip

J'essaie de télécharger un fichier Zip depuis mon contrôleur web api. Il renvoie le fichier mais je reçois un message indiquant que le fichier zip n'est pas valide lorsque j'essaie de l'ouvrir. J'ai vu d'autres articles à ce sujet et la réponse a ajouté le responseType: 'arraybuffer'. Ça ne marche toujours pas pour moi. Je ne reçois aucune erreur dans la console non plus.

  var model = $scope.selection;
    var res = $http.post('/api/apiZipPipeLine/', model)

    res.success(function (response, status, headers, config) {
        saveAs(new Blob([response], { type: "application/octet-stream", responseType: 'arraybuffer' }), 'reports.Zip');
            notificationFactory.success();
    });

contrôleur api

 [HttpPost]
    [ActionName("ZipFileAction")]
    public HttpResponseMessage ZipFiles([FromBody]int[] id)
    {
        if (id == null)
        {//Required IDs were not provided
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
        }

        List<Document> documents = new List<Document>();
        using (var context = new ApplicationDbContext())
        {
            foreach (int NextDocument in id)
            {
                Document document = context.Documents.Find(NextDocument);

                if (document == null)
                {
                    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
                }

                documents.Add(document);
            }
            var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) =>
            {
                try
                {
                    using (var zipFile = new ZipFile())
                    {
                        foreach (var d in documents)
                        {
                            var dt = d.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-');
                            string fileName = String.Format("{0}-{1}-{2}.pdf", dt, d.PipeName, d.LocationAb);
                            zipFile.AddEntry(fileName, d.DocumentUrl);
                        }
                        zipFile.Save(outputStream); //Null Reference Exception
                    }
                }

                finally
                {
                    outputStream.Close();
                }
            });
            streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            streamContent.Headers.ContentDisposition.FileName = "reports.Zip";

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = streamContent
            };
            return response;
        }
    }

Mise à jour pic

19
texas697

Je pense que vous définissez le responseType au mauvais endroit, au lieu de cela:

$http.post('/api/apiZipPipeLine/', model)

Essaye ça:

$http.post('/api/apiZipPipeLine/', model, {responseType:'arraybuffer'})

Jetez un oeil à cette réponse pour plus de détails.

16
Buddy

En fait, vous êtes juste d'ajouter responseType:'arraybuffer'. Cela ajouté au code suivant lors de la réception de la réponse d'ajax demandera un fichier à télécharger:

var a = document.createElement('a');
var blob = new Blob([responseData], {'type':"application/octet-stream"});
a.href = URL.createObjectURL(blob);
a.download = "filename.Zip";
a.click();
4
David Villacis C.