I am trying to download a zip file from my web api controller. It is returning the file but I am getting a message the zipfile is invalid when i try to open. I have seen other posts about this and the response was adding the responseType: 'arraybuffer'. Still isn't working for me. I'm not getting any errors in the console either.
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(); });
api controller
[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; } }
Update
Google Chrome saves zip files as zip file by default. If not, you can right-click the zip-file link (if you have a right mouse button). It will say, "save link as".
I think you're setting the responseType in the wrong place, instead of this:
$http.post('/api/apiZipPipeLine/', model)
Try this:
$http.post('/api/apiZipPipeLine/', model, {responseType:'arraybuffer'})
Take a look at this answer for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With