Загрузить ответ Ajax в виде zip-файла? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь загрузить несколько изображений в виде zip-файла. Поскольку я использую BLOB-объект Azure, сначала я перечислил все BLOB-объекты, затем сжал их с помощью Archiver и использовал функцию конвейера для отправки их клиенту. Но я получаю zip как необработанный файл, и он не загружается. Я использую Node JS + Express. Серверный скрипт:

    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); }

Аутрстрим - это рез. Таким образом, я получаю данные как это:

enter image description here

Как я могу скачать напрямую в виде zip-файла, используя js?

Спасибо

1 Ответ

0 голосов
/ 30 августа 2018

Существует множество способов использования ajax для загрузки файла, во-первых, вы должны иметь возможность получить доступ к данным в двоичном формате (а не к тексту, который используется по умолчанию), установив для responseType значение blob. Затем вы должны использовать способ получить диалоговое окно загрузки для отображения, ниже вы можете увидеть метод привязки с атрибутом загрузки.

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(){

        }
    });

требуется jQuery3 +

...