I am trying to download multiple images as a zip file. As I am using Azure blob, first I listed all blobs then pressed it using Archiver and used pipe function to send it to the client. But I am getting zip as a raw file and it is not downloading. I am using Node js + Express. Server-side script:
function zipURLs(urls, outStream) {
var zipArchive = archiver.create('zip');
async.eachLimit(urls, 3, function(url, done) {
console.log(url);
var stream = request.get(url);
stream.on('error', function(err) {
return done(err);
}).on('end', function() {
return done();
});
// Use the last part of the URL as a filename within the ZIP archive.
zipArchive.append(stream, { name : url.replace(/^.*\//, '') });
}, function(err) {
if (err) throw err;
zipArchive.finalize();
zipArchive.pipe(outStream);
});
}
var data = {};
data.blob_name = value;
console.log('downloading');
$.ajax({
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
url: 'download/',
success: function(data) { console.log(data); }
Outstream is res. So I get data like this:-
How can I download directly as zip file using js?
Thanks
I am trying to download multiple images as a zip file. As I am using Azure blob, first I listed all blobs then pressed it using Archiver and used pipe function to send it to the client. But I am getting zip as a raw file and it is not downloading. I am using Node js + Express. Server-side script:
function zipURLs(urls, outStream) {
var zipArchive = archiver.create('zip');
async.eachLimit(urls, 3, function(url, done) {
console.log(url);
var stream = request.get(url);
stream.on('error', function(err) {
return done(err);
}).on('end', function() {
return done();
});
// Use the last part of the URL as a filename within the ZIP archive.
zipArchive.append(stream, { name : url.replace(/^.*\//, '') });
}, function(err) {
if (err) throw err;
zipArchive.finalize();
zipArchive.pipe(outStream);
});
}
var data = {};
data.blob_name = value;
console.log('downloading');
$.ajax({
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
url: 'download/',
success: function(data) { console.log(data); }
Outstream is res. So I get data like this:-
How can I download directly as zip file using js?
Thanks
Share Improve this question edited Aug 30, 2018 at 15:51 Musa 97.8k17 gold badges122 silver badges143 bronze badges asked Aug 30, 2018 at 14:06 GauthamGAjithGauthamGAjith 3871 gold badge4 silver badges19 bronze badges 6- So how are you getting this data on the client side? – Musa Commented Aug 30, 2018 at 14:28
- In browser... I am sending this to express js – GauthamGAjith Commented Aug 30, 2018 at 14:36
- Well I more interested in the code used in the browser to initiate the call – Musa Commented Aug 30, 2018 at 14:43
- @Musa it's just a Ajax call to download/ – GauthamGAjith Commented Aug 30, 2018 at 14:44
- Post your ajax code – Musa Commented Aug 30, 2018 at 14:55
1 Answer
Reset to default 8There is a lot that goes into using ajax to download a file, first you have to be able to access the data in binary(not text which is the default) by setting the responseType to blob. Then you have to use actually get a way to get the download dialog to show up, below you can see the anchor with download attribute technique.
jQuery.ajax({
url:'download/',
type:'POST',
data: JSON.stringify(data),
contentType: 'application/json',
xhrFields:{
responseType: 'blob'
},
success: function(data){
var anchor = document.getElementById('a');
var url = window.URL || window.webkitURL;
anchor.href = url.createObjectURL(data);
anchor.download = 'archive.zip';
document.body.append(anchor);
anchor.click();
setTimeout(function(){
document.body.removeChild(anchor);
url.revokeObjectURL(anchor.href);
}, 1};
},
error:function(){
}
});
requires jQuery3+