Завантажте декілька файлів однією дією


109

Я не впевнений, чи можливо це за допомогою стандартних веб-технологій.

Я хочу, щоб користувач міг завантажувати кілька файлів за одну дію. Тобто встановіть прапорці поруч із файлами, а потім отримайте всі файли, які були перевірені.

Чи можливо - якщо так, яку основну стратегію ви рекомендуєте. Я знаю, що я можу використовувати комети технології для створення подій на стороні сервера, які викликають HttpResponse, але сподіваюся, що існує більш простий спосіб.

Відповіді:


60

HTTP не підтримує більше одного завантаження файлів одночасно.

Є два рішення:

  • Відкрийте x кількість вікон, щоб ініціювати завантаження файлів (це буде зроблено за допомогою JavaScript)
  • Краще рішення створити скрипт для копіювання файлів

39
Чому zip-файл є кращим рішенням? Це створює додатковий крок для користувача (розпакування).
швидкісний літак

7
Ця сторінка містить javascript, який створює ZIP-файл. Подивіться на сторінку, яка має чудовий приклад. stuk.github.io/jszip
Netsi1964

Третій спосіб - інкапсуляція файлів у файл SVG. Якщо файли відображаються в браузері, SVG видається найкращим способом.
VectorVortec

4
Сам HTTP підтримує формат повідомлень з декількома частинами. Але браузери не переносять аналогічно багатосторонні відповіді з боку сервера, але технічно в цьому немає нічого складного.
CMCDragonkai

2
Це може бути чудовим
juananruiz

84

var links = [
  'https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.exe',
  'https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.dmg',
  'https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.jar'
];

function downloadAll(urls) {
  var link = document.createElement('a');

  link.setAttribute('download', null);
  link.style.display = 'none';

  document.body.appendChild(link);

  for (var i = 0; i < urls.length; i++) {
    link.setAttribute('href', urls[i]);
    link.click();
  }

  document.body.removeChild(link);
}
<button onclick="downloadAll(window.links)">Test me!</button>


3
Я працюю з багатьма типами файлів, включаючи зображення, і це найкраще працювало для мене. Однак link.setAttribute('download', null);усі мої файли перейменовано на недійсні.
техліві

7
Він не працює в IE 11, він завантажує лише .jar (останній пункт у списку), це було ідеальним рішенням :(
Immutable Brick

1
@AngeloMoreira Так, принаймні, це працює в Edge. Якщо ви спробуєте завантажити декілька файлів у IE на сайтах MS, наприклад , вони породили кілька спливаючих вікон, тож я думаю, що найкращим рішенням для IE все ще є від Дмитра Ногіна вище .
Matěj Pokorný

1
@tehlivi - я знайшов те саме. Додайте link.setAttribute('download',filename)внутрішню петлю. Це дозволяє назвати файли все, що завгодно. Також я вважаю, що це має бути лише ім'я файлу, не враховуючи URL-адресу. Нарешті я надсилав два масиви: один із повною URL-адресою та один із лише ім'ям файлу.
PhilMDev

7
Він не працює належним чином у Chrome v75, Windows 10: Єдиний завантажений файл - це Minecraft.jar.
andreivictor

54

Ви можете створити тимчасовий набір прихованих кадрів, розпочати завантаження GET або POST всередині них, дочекатися запуску завантаження та видалити iframes:

<!DOCTYPE HTML>
<html>
<body>
  <button id="download">Download</button> 

  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
  <script type="text/javascript">

     $('#download').click(function() {
       download('http://nogin.info/cv.doc','http://nogin.info/cv.doc');
     });

     var download = function() {
       for(var i=0; i<arguments.length; i++) {
         var iframe = $('<iframe style="visibility: collapse;"></iframe>');
         $('body').append(iframe);
         var content = iframe[0].contentDocument;
         var form = '<form action="' + arguments[i] + '" method="GET"></form>';
         content.write(form);
         $('form', content).submit();
         setTimeout((function(iframe) {
           return function() { 
             iframe.remove(); 
           }
         })(iframe), 2000);
       }
     }      

  </script>
</body>
</html>

Або без jQuery:

 function download(...urls) {
    urls.forEach(url => {
      let iframe = document.createElement('iframe');
      iframe.style.visibility = 'collapse';
      document.body.append(iframe);

      iframe.contentDocument.write(
        `<form action="${url.replace(/\"/g, '"')}" method="GET"></form>`
      );
      iframe.contentDocument.forms[0].submit();

      setTimeout(() => iframe.remove(), 2000);
    });
  }

дивовижно, але з деяких причин файли не завантажуються. Мені здається, що причина, що сторінка перезавантажується після виконання сценарію, здається, є причиною того, що файли не завантажуються. Якась підказка про те, що я роблю?
Chirag Mehta

У мене є кілька проблем із цим рішенням. У IE, оскільки моє батьківське вікно змінило document.domain, у мене заборонено доступ. Існують різні повідомлення про виправлення цього, але всі відчувають себе хакі. У Chrome користувач отримує швидке попереджувальне повідомлення про те, що веб-сайт намагається завантажити декілька файлів (але принаймні це працює). У Firefox я отримую інше поле завантаження, але коли натискаю кнопку "Зберегти", я не отримую діалогового вікна збереження файлів ...
Меланія

Це не спрацювало для мене, оскільки діалогове вікно файлів "блокує" інші діалогові вікна збереження. Те, що я зробив, було дещо злегка хитким - дія миші миші реєструється лише після зникнення діалогового вікна файлу, тому я використав це - але це не перевірено. Я додам це як іншу відповідь.
Карел Білек

2
Чи працює це в IE10? Я отримую: Об'єкт не підтримує властивість чи метод 'write'
Hoppe

чому повернута функція (закриття?) увімкнена setTimeout()?
robisrob

34

Це рішення працює у веб-переглядачах і не викликає попереджень. Замість того, щоб створювати iframe, тут ми створюємо посилання для кожного файлу. Це запобігає появі попереджувальних повідомлень.

Для обробки циклічної частини ми використовуємо setTimeoutнеобхідне для роботи в IE.

/**
 * Download a list of files.
 * @author speedplane
 */
function download_files(files) {
  function download_next(i) {
    if (i >= files.length) {
      return;
    }
    var a = document.createElement('a');
    a.href = files[i].download;
    a.target = '_parent';
    // Use a.download if available, it prevents plugins from opening.
    if ('download' in a) {
      a.download = files[i].filename;
    }
    // Add a to the doc for click to work.
    (document.body || document.documentElement).appendChild(a);
    if (a.click) {
      a.click(); // The click method is supported by most browsers.
    } else {
      $(a).click(); // Backup using jquery
    }
    // Delete the temporary link.
    a.parentNode.removeChild(a);
    // Download the next file with a small timeout. The timeout is necessary
    // for IE, which will otherwise only download the first file.
    setTimeout(function() {
      download_next(i + 1);
    }, 500);
  }
  // Initiate the first download.
  download_next(0);
}
<script>
  // Here's a live example that downloads three test text files:
  function do_dl() {
    download_files([
      { download: "http://www.nt.az/reg.txt", filename: "regs.txt" },
      { download: "https://www.w3.org/TR/PNG/iso_8859-1.txt", filename: "standards.txt" },
      { download: "http://qiime.org/_static/Examples/File_Formats/Example_Mapping_File.txt", filename: "example.txt" },
    ]);
  };
</script>
<button onclick="do_dl();">Test downloading 3 text files.</button>


Це єдиний, хто працював на мене, оскільки мені потрібно підтримувати IE. Дякую.
Øystein Amundsen

1
Ця відповідь золота. Тільки той, який працює у всіх браузерах без попереджувального повідомлення. Спеціально IE. Блискучі речі
Mukul Goel

Не працює в Chrome OSX, він просить дозволити багаторазове завантаження, але навіть якщо це зробити, завантажується тільки перший файл, і я почув кількість "звукового сигналу", що відповідає кількості файлів, які потрібно завантажити
Аллан Ракін,

2
Кнопка нічого не робить Google Chrome Version 76.0.3809.100 (Official Build) (64-bit).
1934286

1
Кнопка не працює у переливанні стека. Виконати фрагмент коду. Browser Crome @speedplane
mb

5

Найпростішим способом було б подання кількох файлів, зв'язаних у файл ZIP.

Я припускаю, що ви можете ініціювати численні завантаження файлів, використовуючи купу iframes або спливаючих вікон, але з точки зору зручності використання, ZIP-файл все-таки краще. Хто хоче перейти через десять діалогових вікон "Зберегти як", які відобразить браузер?


3
Я усвідомлюю, що ваша відповідь ведеться ще з 2010 року, але в наші дні багато користувачів переглядають смартфони, деякі з яких не можуть відкрити блискавки за замовчуванням (приятель каже мені, що Samsung S4 Active не може відкрити блискавки).
Hydraxan14

4

Я погоджуюся, що zip-файл - це більш охайне рішення ... Але якщо вам доведеться натиснути кілька файлів, ось таке рішення я придумав. Він працює в IE 9 і вище (можливо, і нижча версія - я його ще не перевіряв), Firefox, Safari та Chrome. Chrome відобразить повідомлення користувачеві, щоб отримати згоду на завантаження декількох файлів при першому використанні вашого веб-сайту.

function deleteIframe (iframe) {
    iframe.remove(); 
}
function createIFrame (fileURL) {
    var iframe = $('<iframe style="display:none"></iframe>');
    iframe[0].src= fileURL;
    $('body').append(iframe);
    timeout(deleteIframe, 60000, iframe);             
 }
 // This function allows to pass parameters to the function in a timeout that are 
 // frozen and that works in IE9
 function timeout(func, time) {
      var args = [];
      if (arguments.length >2) {
           args = Array.prototype.slice.call(arguments, 2);
      }
      return setTimeout(function(){ return func.apply(null, args); }, time);
 }
 // IE will process only the first one if we put no delay
 var wait = (isIE ? 1000 : 0);
 for (var i = 0; i < files.length; i++) {  
      timeout(createIFrame, wait*i, files[i]);
 }

Єдиним побічним ефектом цієї методики є те, що користувач побачить затримку між поданням та діалоговим вікном завантаження. Щоб мінімізувати цей ефект, я пропоную вам скористатися описаною тут технікою, і в цьому питанні Визначте, коли браузер отримує завантаження файлів, що складаються з встановлення файлу cookie з вашим файлом, щоб знати, що воно почалося завантаження. Вам потрібно буде перевірити це cookie на стороні клієнта та надіслати його на стороні сервера. Не забудьте встановити правильний шлях для вашого файлу cookie, інакше ви його не бачите. Вам також доведеться адаптувати рішення для завантаження декількох файлів.


4

Версія jQuery iframe відповідає:

function download(files) {
    $.each(files, function(key, value) {
        $('<iframe></iframe>')
            .hide()
            .attr('src', value)
            .appendTo($('body'))
            .load(function() {
                var that = this;
                setTimeout(function() {
                    $(that).remove();
                }, 100);
            });
    });
}

Кожен шукає масив. Це спрацює: download(['http://nogin.info/cv.doc','http://nogin.info/cv.doc']);однак це не працює для завантаження файлів зображень.
tehlivi

3

Кутове рішення:

HTML

    <!doctype html>
    <html ng-app='app'>
        <head>
            <title>
            </title>
            <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
            <link rel="stylesheet" href="style.css">
        </head>
        <body ng-cloack>        
            <div class="container" ng-controller='FirstCtrl'>           
              <table class="table table-bordered table-downloads">
                <thead>
                  <tr>
                    <th>Select</th>
                    <th>File name</th>
                    <th>Downloads</th>
                  </tr>
                </thead>
                <tbody>
                  <tr ng-repeat = 'tableData in tableDatas'>
                    <td>
                        <div class="checkbox">
                          <input type="checkbox" name="{{tableData.name}}" id="{{tableData.name}}" value="{{tableData.name}}" ng-model= 'tableData.checked' ng-change="selected()">
                        </div>
                    </td>
                    <td>{{tableData.fileName}}</td>
                    <td>
                        <a target="_self" id="download-{{tableData.name}}" ng-href="{{tableData.filePath}}" class="btn btn-success pull-right downloadable" download>download</a>
                    </td>
                  </tr>              
                </tbody>
              </table>
                <a class="btn btn-success pull-right" ng-click='downloadAll()'>download selected</a>

                <p>{{selectedone}}</p>
            </div>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
            <script src="script.js"></script>
        </body>
    </html>

app.js

var app = angular.module('app', []);            
app.controller('FirstCtrl', ['$scope','$http', '$filter', function($scope, $http, $filter){

$scope.tableDatas = [
    {name: 'value1', fileName:'file1', filePath: 'data/file1.txt', selected: true},
    {name: 'value2', fileName:'file2', filePath: 'data/file2.txt', selected: true},
    {name: 'value3', fileName:'file3', filePath: 'data/file3.txt', selected: false},
    {name: 'value4', fileName:'file4', filePath: 'data/file4.txt', selected: true},
    {name: 'value5', fileName:'file5', filePath: 'data/file5.txt', selected: true},
    {name: 'value6', fileName:'file6', filePath: 'data/file6.txt', selected: false},
  ];  
$scope.application = [];   

$scope.selected = function() {
    $scope.application = $filter('filter')($scope.tableDatas, {
      checked: true
    });
}

$scope.downloadAll = function(){
    $scope.selectedone = [];     
    angular.forEach($scope.application,function(val){
       $scope.selectedone.push(val.name);
       $scope.id = val.name;        
       angular.element('#'+val.name).closest('tr').find('.downloadable')[0].click();
    });
}         


}]);

приклад роботи: https://plnkr.co/edit/XynXRS7c742JPfCA3IpE?p=preview


1

Щоб покращити відповідь @Dmitry Nogin: у моєму випадку це спрацювало.

Однак це не перевірено, оскільки я не впевнений, як працює діалог файлів на різних комбінаціях ОС / браузера. (Таким чином, вікі спільноти.)

<script>
$('#download').click(function () {
    download(['http://www.arcelormittal.com/ostrava/doc/cv.doc', 
              'http://www.arcelormittal.com/ostrava/doc/cv.doc']);
});

var download = function (ar) {
    var prevfun=function(){};
    ar.forEach(function(address) {  
        var pp=prevfun;
        var fun=function() {
                var iframe = $('<iframe style="visibility: collapse;"></iframe>');
                $('body').append(iframe);
                var content = iframe[0].contentDocument;
                var form = '<form action="' + address + '" method="POST"></form>';
                content.write(form);
                $(form).submit();
                setTimeout(function() {    
                    $(document).one('mousemove', function() { //<--slightly hacky!
                        iframe.remove();
                        pp();
                    });
                },2000);
        }
        prevfun=fun; 
      });
      prevfun();   
}
</script>

1

Це працює у всіх браузерах (IE11, firefox, Edge, Chrome та Chrome Mobile) Мої документи містяться в декількох елементах вибору. Схоже, у браузерів виникають проблеми, коли ви намагаєтеся зробити це занадто швидко ... Тому я використав тайм-аут.

//user clicks a download button to download all selected documents
$('#downloadDocumentsButton').click(function () {
    var interval = 1000;
    //select elements have class name of "document"
    $('.document').each(function (index, element) {
        var doc = $(element).val();
        if (doc) {
            setTimeout(function () {
                window.location = doc;
            }, interval * (index + 1));
        }
    });
});

Це рішення, яке використовує обіцянки:

 function downloadDocs(docs) {
        docs[0].then(function (result) {
            if (result.web) {
                window.open(result.doc);
            }
            else {
                window.location = result.doc;
            }
            if (docs.length > 1) {
                setTimeout(function () { return downloadDocs(docs.slice(1)); }, 2000);
            }
        });
    }

 $('#downloadDocumentsButton').click(function () {
        var files = [];
        $('.document').each(function (index, element) {
            var doc = $(element).val();
            var ext = doc.split('.')[doc.split('.').length - 1];

            if (doc && $.inArray(ext, docTypes) > -1) {
                files.unshift(Promise.resolve({ doc: doc, web: false }));
            }
            else if (doc && ($.inArray(ext, webTypes) > -1 || ext.includes('?'))) {
                files.push(Promise.resolve({ doc: doc, web: true }));
            }
        });

        downloadDocs(files);
    });

1

На сьогодні найпростіше рішення (принаймні, в ubuntu / linux):

  • створити текстовий файл із URL-адресами файлів для завантаження (тобто file.txt)
  • помістіть 'file.txt' у каталог, куди потрібно завантажити файли
  • відкрийте термінал у каталозі завантажень із попереднього посилання
  • завантажте файли командою 'wget -i file.txt'

Працює як шарм.


Я не розумію, чому це стає недозволеним. Це прекрасно працює, велике дякую.
Мартін Фюрхольц

1

Щоб вирішити це, я створив бібліотеку JS для передачі декількох файлів безпосередньо в zip на стороні клієнта. Основна унікальна особливість полягає в тому, що він не має обмежень розміру з пам'яті (все передається в потоці), а також формату zip (він використовує zip64, якщо вміст перевищує 4 Гб).

Оскільки він не робить стиснення, він також дуже ефективний.

Знайдіть "downzip" на npm або github !


1

Наступний сценарій виконав цю роботу витончено.

var urls = [
'https://images.pexels.com/photos/432360/pexels-photo-432360.jpeg',
'https://images.pexels.com/photos/39899/rose-red-tea-rose-regatta-39899.jpeg'
];

function downloadAll(urls) {


  for (var i = 0; i < urls.length; i++) {
    forceDownload(urls[i], urls[i].substring(urls[i].lastIndexOf('/')+1,urls[i].length))
  }
}
function forceDownload(url, fileName){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = "blob";
    xhr.onload = function(){
        var urlCreator = window.URL || window.webkitURL;
        var imageUrl = urlCreator.createObjectURL(this.response);
        var tag = document.createElement('a');
        tag.href = imageUrl;
        tag.download = fileName;
        document.body.appendChild(tag);
        tag.click();
        document.body.removeChild(tag);
    }
    xhr.send();
}

0

Я шукаю рішення для цього, але розпакування файлів у JavaScript не було таким чистим, як мені сподобалось. Я вирішив інкапсулювати файли в один SVG-файл.

Якщо у вас збережені файли на сервері (у мене немає), ви можете просто встановити href у SVG.

У моєму випадку я перетворять файли в base64 і вставляю їх у SVG.

Редагувати: SVG працював дуже добре. Якщо ви тільки збираєтеся завантажувати файли, ZIP може бути кращим. Якщо ви збираєтеся відображати файли, то SVG здається вищим.


0

При використанні компонентів Ajax можна запустити кілька завантажень. Тому вам доведеться користуватися https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow

Додайте екземпляр AJAXDownload на свою сторінку або будь-яку іншу. Створіть AjaxButton та замініть команду on-Submit. Створіть AbstractAjaxTimerBehavior і починайте завантажувати.

        button = new AjaxButton("button2") {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form)
        {
            MultiSitePage.this.info(this);
            target.add(form);

            form.add(new AbstractAjaxTimerBehavior(Duration.milliseconds(1)) {

                @Override
                protected void onTimer(AjaxRequestTarget target) {
                    download.initiate(target);
                }

            });     
        }

Щасливого завантаження!


javascrpt?!?!?!?!?!
bluejayke

0

Нижче код 100% працює.

Крок 1 : Вставте код нижче у файл index.html

<!DOCTYPE html>
<html ng-app="ang">

<head>
    <title>Angular Test</title>
    <meta charset="utf-8" />
</head>

<body>
    <div ng-controller="myController">
        <button ng-click="files()">Download All</button>
    </div>

    <script src="angular.min.js"></script>
    <script src="index.js"></script>
</body>

</html>

Крок 2 : Вставте код нижче у файл index.js

"use strict";

var x = angular.module('ang', []);

    x.controller('myController', function ($scope, $http) {
        var arr = [
            {file:"http://localhost/angularProject/w3logo.jpg", fileName: "imageone"},
            {file:"http://localhost/angularProject/cv.doc", fileName: "imagetwo"},
            {file:"http://localhost/angularProject/91.png", fileName: "imagethree"}
        ];

        $scope.files = function() {
            angular.forEach(arr, function(val, key) {
                $http.get(val.file)
                .then(function onSuccess(response) {
                    console.log('res', response);
                    var link = document.createElement('a');
                    link.setAttribute('download', val.fileName);
                    link.setAttribute('href', val.file);
                    link.style.display = 'none';
                    document.body.appendChild(link);
                    link.click(); 
                    document.body.removeChild(link);
                })
                .catch(function onError(error) {
                    console.log('error', error);
                })
            })
        };
    });

ПРИМІТКА . Переконайтеся, що всі три файли, які збираються завантажити, будуть розміщені в одній папці разом з файлами angularProject / index.html або angularProject / index.js .


чи ти зліпно замісив айн [останній аеромотор] улар для туї / ???
bluejayke

0

Отримання списку URL з викликом ajax, а потім використання плагіна jquery для завантаження декількох файлів паралельно.

  $.ajax({
        type: "POST",
        url: URL,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: data,
        async: true,
        cache: false,
        beforeSend: function () {
            blockUI("body");
        },
        complete: function () { unblockUI("body"); },
        success: function (data) {
           //here data --> contains list of urls with comma seperated
            var listUrls= data.DownloadFilePaths.split(',');
            listUrls.forEach(function (url) {
                $.fileDownload(url);
            });
            return false; 
        },
        error: function (result) {
            $('#mdlNoDataExist').modal('show');
        }

    });

0

Ось як я це роблю. Я відкриваю декілька ZIP, але й інших даних (я експортую проект у PDF та одночасно багато ZIP-файлів із документом).

Я просто копіюю минулу частину свого коду. Дзвінок із кнопки у списку:

$url_pdf = "pdf.php?id=7";
$url_zip1 = "zip.php?id=8";
$url_zip2 = "zip.php?id=9";
$btn_pdf = "<a href=\"javascript:;\" onClick=\"return open_multiple('','".$url_pdf.",".$url_zip1.",".$url_zip2."');\">\n";
$btn_pdf .= "<img src=\"../../../images/icones/pdf.png\" alt=\"Ver\">\n";
$btn_pdf .= "</a>\n"

Отже, основний дзвінок до звичайної програми JS (правила ванілі!). ось JS звичайний:

 function open_multiple(base,url_publication)
 {
     // URL of pages to open are coma separated
     tab_url = url_publication.split(",");
     var nb = tab_url.length;
     // Loop against URL    
     for (var x = 0; x < nb; x++)
     {
        window.open(tab_url[x]);
      }

     // Base is the dest of the caller page as
     // sometimes I need it to refresh
     if (base != "")
      {
        window.location.href  = base;
      }
   }

Трюк полягає в тому, щоб НЕ вводити пряме посилання ZIP-файлу, а надсилати його до браузера. Подобається це:

  $type_mime = "application/zip, application/x-compressed-zip";
 $the_mime = "Content-type: ".$type_mime;
 $tdoc_size = filesize ($the_zip_path);
 $the_length = "Content-Length: " . $tdoc_size;
 $tdoc_nom = "Pesquisa.zip";
 $the_content_disposition = "Content-Disposition: attachment; filename=\"".$tdoc_nom."\"";

  header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");   // Date in the past
  header($the_mime);
  header($the_length);
  header($the_content_disposition);

  // Clear the cache or some "sh..." will be added
  ob_clean();
  flush();
  readfile($the_zip_path);
  exit();

-1
           <p class="style1">



<a onclick="downloadAll(window.links)">Balance Sheet Year 2014-2015</a>

</p>

<script>
 var links = [
  'pdfs/IMG.pdf',
  'pdfs/IMG_0001.pdf',
 'pdfs/IMG_0002.pdf',
 'pdfs/IMG_0003.pdf',
'pdfs/IMG_0004.pdf',
'pdfs/IMG_0005.pdf',
 'pdfs/IMG_0006.pdf'

];

function downloadAll(urls) {
  var link = document.createElement('a');

  link.setAttribute('download','Balance Sheet Year 2014-2015');
  link.style.display = 'none';

  document.body.appendChild(link);

  for (var i = 0; i < urls.length; i++) {
    link.setAttribute('href', urls[i]);
    link.click();
  }

  document.body.removeChild(link);
}
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.