最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Download Ajax response as zip file? - Stack Overflow

programmeradmin3浏览0评论

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
 |  Show 1 more ment

1 Answer 1

Reset to default 8

There 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+

发布评论

评论列表(0)

  1. 暂无评论