Scarica più file con un'unica azione


109

Non sono sicuro che ciò sia possibile utilizzando tecnologie web standard.

Voglio che l'utente sia in grado di scaricare più file in un'unica azione. Cioè fare clic sulle caselle di controllo accanto ai file e quindi ottenere tutti i file che sono stati selezionati.

È possibile - in tal caso, quale strategia di base consigli? So di poter utilizzare la tecnologia delle comete per creare eventi lato server che attivano una HttpResponse, ma spero che esista un modo più semplice.

Risposte:


60

HTTP non supporta più di un download di file contemporaneamente.

Esistono due soluzioni:

  • Apri x quantità di finestre per avviare il download dei file (questo sarebbe fatto con JavaScript)
  • soluzione preferita creare uno script per comprimere i file

39
Perché un file zip è la soluzione preferita ? Crea un passaggio aggiuntivo per l'utente (decompressione).
speedplane

7
Questa pagina contiene javascript che crea file ZIP. Guarda la pagina che ha un ottimo esempio. stuk.github.io/jszip
Netsi1964

Un terzo modo è incapsulare i file in un file SVG. Se i file vengono visualizzati nel browser, SVG sembra essere il modo migliore.
VectorVortec

4
HTTP stesso supporta il formato dei messaggi multipart. Ma i browser non analizzano in modo portabile le risposte multiparte dal lato server, ma tecnicamente non c'è niente di difficile nel farlo.
CMCDragonkai

2
Questa può essere una soluzione eccellente con javascript github.com/sindresorhus/multi-download
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
Sto lavorando con molti tipi di file, comprese le immagini, e questo ha funzionato meglio per me. Tuttavia, link.setAttribute('download', null);ho rinominato tutti i miei file in null.
tehlivi

7
Non funziona in IE 11, scarica solo il .jar (ultimo elemento nell'elenco) è stata la soluzione perfetta :(
Immutable Brick

1
@AngeloMoreira Sì, almeno funziona in Edge. Se provi a scaricare più file in IE su siti MS, ad esempio , generano più finestre pop-up, quindi penso che la soluzione migliore per IE sia ancora da Dmitry Nogin sopra .
Matěj Pokorný

1
@tehlivi - Ho trovato la stessa cosa. Aggiungi l' link.setAttribute('download',filename)interno del ciclo. Ciò ti consente di denominare i file come desideri. Inoltre, credo che debba essere solo il nome del file senza includere l'URL. Ho finito per inviare due array: uno con l'URL completo e uno con solo il nome del file.
PhilMDev

7
Non funziona correttamente in Chrome v75, Windows 10: l'unico file scaricato è Minecraft.jar.
andreivictor

54

Puoi creare un set temporaneo di iframe nascosti, avviare il download tramite GET o POST al loro interno, attendere l'avvio dei download e rimuovere gli iframe:

<!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>

Oppure, senza 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);
    });
  }

fantastico, ma per alcuni motivi i file non vengono scaricati. A me il motivo sembra che la pagina si ricarichi dopo l'esecuzione dello script, sembra essere il motivo per cui i file non vengono scaricati. Qualche idea su cosa sto facendo di sbagliato?
Chirag Mehta

Ho più problemi con questa soluzione. In IE poiché la mia finestra principale ha cambiato document.domain, ho un accesso negato. Ci sono vari post su come risolvere questo problema, ma tutti sembrano hacky. In Chrome, all'utente viene visualizzato un messaggio di avviso che informa che il sito Web tenta di scaricare più file (ma almeno funziona). In Firefox, ottengo una casella di download diversa ma quando faccio clic su Salva, non ottengo la finestra di dialogo di salvataggio del file ...
Melanie

Questo non ha funzionato per me, perché la finestra di dialogo del file "blocca" la visualizzazione delle altre finestre di dialogo di salvataggio. Quello che ho fatto è stato qualcosa di leggermente hacky - l'azione di rimozione del mouse si registra solo dopo che la finestra di dialogo del file scompare, quindi l'ho usata - ma non è stata testata. Lo aggiungerò come un'altra risposta.
Karel Bílek

2
Funziona in IE10? Ottengo: L'oggetto non supporta la proprietà o il metodo "scrivi"
Hoppe

perché la funzione restituita (chiusura?) su setTimeout()?
robisrob

34

Questa soluzione funziona su tutti i browser e non attiva avvisi. Invece di creare un iframe, qui creiamo un collegamento per ogni file. Ciò impedisce la visualizzazione di messaggi di avviso.

Per gestire la parte in loop, usiamo setTimeout, che è necessario perché funzioni in 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>


Questo è l'unico qui che ha funzionato per me, dato che devo supportare IE. Grazie.
Øystein Amundsen

1
Questa risposta è d'oro. Solo uno che funziona in tutti i browser senza un messaggio di avviso. Specialmente IE. Roba
geniale

Non funziona in Chrome OSX, mi chiede di consentire il download multiplo ma anche se lo faccio, viene scaricato solo il primo file e ho sentito una quantità di "beep" corrispondente al numero di file da scaricare rimanenti
Allan Raquin

2
Il pulsante non fa nulla Google Chrome Version 76.0.3809.100 (Official Build) (64-bit).
1934286

1
Il pulsante non funziona in overflow dello stack Esegui snippet di codice. Browser Crome @speedplane
mb

5

Il modo più semplice sarebbe servire i più file raggruppati in un file ZIP.

Suppongo che potresti avviare più download di file utilizzando un mucchio di iframe o popup, ma dal punto di vista dell'usabilità, un file ZIP è ancora migliore. Chi vuole fare clic su dieci finestre di dialogo "Salva con nome" visualizzate dal browser?


3
Mi rendo conto che la tua risposta risale al 2010, ma oggigiorno molti utenti navigano con gli smartphone, alcuni dei quali non possono aprire le zip per impostazione predefinita (un amico mi dice che il suo Samsung S4 Active non può aprire le zip).
Hydraxan14

4

Sono d'accordo sul fatto che un file zip sia una soluzione più ordinata ... Ma se devi spingere più file, ecco la soluzione che ho trovato. Funziona in IE 9 e versioni successive (forse anche una versione inferiore - non l'ho testata), Firefox, Safari e Chrome. Chrome visualizzerà un messaggio all'utente per ottenere il suo consenso a scaricare più file la prima volta che il tuo sito lo utilizza.

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

L'unico effetto collaterale di questa tecnica è che l'utente vedrà un ritardo tra l'invio e la visualizzazione della finestra di dialogo di download. Per ridurre al minimo questo effetto, ti consiglio di utilizzare la tecnica descritta qui e su questa domanda Rileva quando il browser riceve il download di file che consiste nell'impostare un cookie con il tuo file per sapere che è iniziato il download. Dovrai controllare questo cookie sul lato client e inviarlo sul lato server. Non dimenticare di impostare il percorso corretto per il tuo cookie o potresti non vederlo. Dovrai anche adattare la soluzione per il download di più file.


4

Una versione jQuery dell'iframe risponde:

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

Ciascuno sta cercando un array. Funzionerà: download(['http://nogin.info/cv.doc','http://nogin.info/cv.doc']);Tuttavia, non funziona per il download di file di immagine.
tehlivi

3

Soluzione angolare:

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


}]);

esempio funzionante: https://plnkr.co/edit/XynXRS7c742JPfCA3IpE?p=preview


1

Per migliorare la risposta di @Dmitry Nogin: nel mio caso ha funzionato.

Tuttavia, non è stato testato, poiché non sono sicuro di come funzioni il dialogo del file su varie combinazioni di OS / browser. (Così wiki della comunità.)

<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

Funziona in tutti i browser (IE11, Firefox, Edge, Chrome e Chrome Mobile) I miei documenti sono in più elementi selezionati. I browser sembrano avere problemi quando provi a farlo troppo velocemente ... Quindi ho usato un timeout.

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

Questa è una soluzione che utilizza le promesse:

 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

Di gran lunga la soluzione più semplice (almeno in ubuntu / linux):

  • creare un file di testo con gli URL dei file da scaricare (es. file.txt)
  • metti "file.txt" nella directory in cui desideri scaricare i file
  • aprire il terminale nella directory di download dal lin precedente
  • scarica i file con il comando 'wget -i file.txt'

Funziona come un fascino.


Non capisco perché questo venga sottovalutato. Funziona perfettamente, grazie mille.
Martin Fürholz

1

Per risolvere questo problema, ho creato una libreria JS per lo streaming di più file direttamente in uno zip sul lato client. La principale caratteristica unica è che non ha limiti di dimensione dalla memoria (tutto viene trasmesso in streaming) né dal formato zip (utilizza zip64 se i contenuti sono più di 4 GB).

Dal momento che non fa compressione, è anche molto performante.

Trova "downzip" su npm o github !


1

Il seguente script ha svolto questo lavoro con garbo.

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

Sto cercando una soluzione per farlo, ma decomprimere i file in javascript non è stato così pulito come mi piaceva. Ho deciso di incapsulare i file in un unico file SVG.

Se hai i file archiviati sul server (io no), puoi semplicemente impostare href nell'SVG.

Nel mio caso, convertirò i file in base64 e li incorporerò nell'SVG.

Modifica: l'SVG ha funzionato molto bene. Se stai solo per scaricare i file, ZIP potrebbe essere migliore. Se stai per visualizzare i file, SVG sembra superiore.


0

Quando si utilizzano componenti Ajax è possibile avviare più download. Quindi devi usare https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow

Aggiungi un'istanza di AJAXDownload alla tua pagina o qualsiasi altra cosa. Crea un AjaxButton e sovrascrivi onSubmit. Crea un AbstractAjaxTimerBehavior e avvia il download.

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

            });     
        }

Buon download!


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

0

Sotto il codice 100% funzionante.

Passaggio 1 : incolla sotto il codice nel file 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>

Passaggio 2 : incolla il codice sottostante nel file 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);
                })
            })
        };
    });

NOTA : assicurati che tutti e tre i file che verranno scaricati vengano inseriti nella stessa cartella insieme ai file angularProject / index.html o angularProject / index.js .


impastare rilly ayng [l'ultimo dominatore dell'aria] ular per questo / ???
bluejayke

0

Ottenere l'elenco di URL con la chiamata ajax e quindi utilizzare il plug-in jquery per scaricare più file in parallelo.

  $.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

Ecco come lo faccio. Apro più ZIP ma anche altri tipi di dati (esporto progetto in PDF e contemporaneamente molti ZIP con documento).

Copio solo una parte del mio codice. La chiamata da un pulsante in un elenco:

$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"

Quindi una chiamata di base a una routine JS (regole Vanilla!). ecco la routine 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;
      }
   }

Il trucco è NON dare il link diretto al file ZIP ma inviarlo al browser. Come questo:

  $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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.