एक कार्रवाई के साथ कई फाइलें डाउनलोड करें


109

मुझे यकीन नहीं है कि यह मानक वेब प्रौद्योगिकियों का उपयोग करना संभव है।

मैं चाहता हूं कि उपयोगकर्ता एक ही कार्रवाई में कई फ़ाइलों को डाउनलोड करने में सक्षम हो। फ़ाइलों के बगल में स्थित चेक बॉक्स पर क्लिक करें, और फिर उन सभी फ़ाइलों को प्राप्त करें जिन्हें चेक किया गया था।

क्या यह संभव है - यदि ऐसा है तो आप किस बुनियादी रणनीति की सलाह देते हैं। मुझे पता है कि मैं सर्वर साइड इवेंट बनाने के लिए धूमकेतु तकनीक का उपयोग कर सकता हूं जो एक HttpResponse को ट्रिगर करता है लेकिन मुझे उम्मीद है कि एक सरल तरीका है।

जवाबों:


60

HTTP एक बार में एक से अधिक फ़ाइल डाउनलोड का समर्थन नहीं करता है।

दो समाधान हैं:

  • फ़ाइल डाउनलोड आरंभ करने के लिए विंडोज़ की खुली मात्रा (यह जावास्क्रिप्ट के साथ किया जाएगा)
  • पसंदीदा समाधान फ़ाइलों को ज़िप करने के लिए एक स्क्रिप्ट बनाते हैं

39
क्यों एक ज़िप फ़ाइल पसंदीदा समाधान है? यह उपयोगकर्ता के लिए एक अतिरिक्त कदम बनाता है (अनज़िपिंग)।
स्पीड प्लेन

7
इस पृष्ठ में जावास्क्रिप्ट है जो ज़िप फ़ाइल बनाता है। पृष्ठ को देखो इसका एक महान उदाहरण है। stuk.github.io/jszip
Netsi1964

एक तीसरा तरीका है फाइलों को एसवीजी फाइल में इनकैप्सुलेट करना। यदि फ़ाइलें ब्राउज़र में प्रदर्शित होती हैं, तो एसवीजी सबसे अच्छा तरीका है।
वेक्टरवाक्टेक

4
HTTP स्वयं मल्टीपार्ट संदेश प्रारूप का समर्थन करता है। लेकिन ब्राउज़र सर्वर साइड से मल्टीपार्ट प्रतिक्रियाओं को पार्स नहीं करते, लेकिन तकनीकी रूप से ऐसा करने में मुश्किल नहीं है।
CMCDragonkai

2
यह जावास्क्रिप्ट 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
मैं चित्रों सहित कई फ़ाइल प्रकारों के साथ काम कर रहा हूं, और इसने मेरे लिए सबसे अच्छा काम किया। हालाँकि, link.setAttribute('download', null);मेरी सभी फ़ाइलों का नाम बदलने के लिए।
तहलवी

7
यह IE 11 में काम नहीं करता है, यह केवल .jar डाउनलोड करता है (सूची में अंतिम आइटम) यह एकदम सही समाधान था :(
अपरिवर्तनीय ईंट

1
@AngeloMoreira हां, कम से कम यह एज में काम करता है। यदि आप एमएस साइटों पर IE में कई फ़ाइलों को डाउनलोड करने का प्रयास करते हैं, उदाहरण के लिए , वे कई पॉप-अप विंडो को स्पॉन करते हैं, तो मुझे लगता है कि IE के लिए सबसे अच्छा समाधान अभी भी दिमित्री नोगिन से ऊपर है
मटोज पोकॉर्नी

1
@tehlivi - मुझे वही मिला। link.setAttribute('download',filename)लूप के अंदर जोड़ें । इससे आप अपनी इच्छानुसार फ़ाइलों को नाम दे सकते हैं। इसके अलावा, मेरा मानना ​​है कि इसे केवल URL सहित फ़ाइल नाम होना चाहिए। मैंने दो सरणियाँ भेजना समाप्त कर दिया: एक पूर्ण URL के साथ और एक केवल फ़ाइल नाम के साथ।
फिलमदेव

7
यह क्रोम v75, विंडोज 10 में ठीक से काम नहीं करता है: डाउनलोड की गई एकमात्र फ़ाइल है Minecraft.jar
andreivictor

54

आप छिपे हुए iframes का एक अस्थायी सेट बना सकते हैं, उनके अंदर 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);
    });
  }

भयानक, लेकिन कुछ कारणों से फाइलें डाउनलोड नहीं हो रही हैं। मेरे लिए कारण ऐसा लगता है कि स्क्रिप्ट निष्पादित होने के बाद पृष्ठ पुनः लोड होता है, लगता है कि फ़ाइलों के डाउनलोड न होने का कारण है। मैं क्या गलत कर रहा हूँ पर कोई सुराग?
चिराग मेहता

मुझे इस समाधान के साथ कई मुद्दे मिले हैं। IE में जब से मेरी मूल विंडो ने document.domain को बदल दिया है, मेरे पास एक एक्सेस अस्वीकृत है। इसे ठीक करने के बारे में विभिन्न पोस्ट हैं, लेकिन सभी हैक करने का अनुभव करते हैं। क्रोम में, उपयोगकर्ता को एक चेतावनी संदेश मिलने का संकेत मिलता है, जिसमें बताया गया है कि वेब साइट कई फ़ाइलों (लेकिन यह कम से कम काम करती है) को लोड करने की कोशिश करती है। फ़ायरफ़ॉक्स में, मुझे अलग-अलग डाउलोड बॉक्स मिलते हैं, लेकिन जब मैं सेव पर क्लिक करता हूं, तो मुझे सेव फ़ाइल डायलॉग नहीं मिलता ...
मेलानी

यह मेरे लिए काम नहीं करता था, क्योंकि फ़ाइल डायलॉग अन्य "डायलॉग" को प्रदर्शित करने के लिए ब्लॉक करता है। मैंने जो कुछ किया था वह थोड़ा हैसी था - फ़ाइल संवाद गायब होने के बाद ही mousemove एक्शन रजिस्टर करता है , इसलिए मैंने इसका उपयोग किया है - लेकिन इसका परीक्षण नहीं किया गया है। मैं इसे दूसरे उत्तर के रूप में जोड़ूंगा।
कारेल बिलेक

2
IE10 में यह काम करता है? मुझे मिलता है: वस्तु संपत्ति या विधि 'लिखने' का समर्थन नहीं करती है
होप

क्यों पर लौटे समारोह (बंद?) setTimeout()?
रॉबिस्रब नोव

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 एमंडसन

1
यह उत्तर सुनहरा है। केवल एक जो चेतावनी संदेश के बिना सभी ब्राउज़रों में काम करता है। विशेष रूप से IE। शानदार सामान
मुकुल गोयल

Chrome OSX में काम नहीं कर रहा है, यह मुझे कई डाउनलोड करने की अनुमति देने के लिए कहता है, लेकिन अगर मैं करता हूं, तो केवल पहली फ़ाइल डाउनलोड की जाती है और मुझे बाईं ओर डाउनलोड करने के लिए फ़ाइलों की संख्या के अनुसार "बीप" की मात्रा सुनाई देती है
एलन राउकिन

2
बटन कुछ नहीं करता है Google Chrome Version 76.0.3809.100 (Official Build) (64-bit)
1934286

1
स्टैक ओवरफ्लो में काम न करने वाला बटन रन कोड स्निपेट। ब्राउजर क्रोम @speedplane
mb

5

सबसे आसान तरीका एक ज़िप फ़ाइल में बंडल किए गए कई फ़ाइलों की सेवा करना होगा।

मुझे लगता है कि आप iframes या पॉपअप के एक समूह का उपयोग करके कई फ़ाइल डाउनलोड आरंभ कर सकते हैं, लेकिन प्रयोज्य दृष्टिकोण से, एक ज़िप फ़ाइल अभी भी बेहतर है। कौन दस "सेव एज़" संवादों के माध्यम से क्लिक करना चाहता है जो ब्राउज़र लाएगा?


3
मुझे लगता है कि आपका जवाब 2010 से वापस आ गया है, लेकिन आजकल बहुत सारे उपयोगकर्ता स्मार्टफोन के साथ ब्राउज़ कर रहे हैं, जिनमें से कुछ डिफ़ॉल्ट रूप से ज़िप नहीं खोल सकते हैं (एक दोस्त मुझे बताता है कि उनका सैमसंग एस 4 सक्रिय ज़िप नहीं खोल सकता है)।
हाइड्रैक्सन 14

4

मैं इस बात से सहमत हूं कि एक ज़िप फ़ाइल एक शून्य समाधान है ... लेकिन अगर आपको एक से अधिक फ़ाइल पुश करना है, तो यहां वह समाधान है जिसके साथ मैं आया था। यह IE 9 और इसके बाद के संस्करण (संभवतः निचले संस्करण भी - मैंने इसे परीक्षण नहीं किया है), फ़ायरफ़ॉक्स, सफारी और क्रोम में काम करता है। पहली बार आपकी साइट द्वारा इसका उपयोग करने पर कई फ़ाइलों को डाउनलोड करने के लिए 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]);
 }

इस तकनीक का एकमात्र दुष्प्रभाव यह है कि उपयोगकर्ता को सबमिट और डाउनलोड संवाद दिखाने में देरी दिखाई देगी। इस प्रभाव को कम करने के लिए, मेरा सुझाव है कि आप यहां वर्णित तकनीक का उपयोग करें और इस सवाल का पता लगाएं कि ब्राउज़र कब फ़ाइल डाउनलोड प्राप्त करता है जिसमें आपकी फ़ाइल को कुकी के साथ सेट करना है ताकि यह पता चल सके कि उसने डाउनलोड शुरू कर दिया है। आपको इस कुकी को क्लाइंट की ओर और सर्वर साइड पर भेजना होगा। अपने कुकी के लिए उचित पथ निर्धारित करना न भूलें या आप उसे नहीं देख सकते। आपको कई फ़ाइल डाउनलोड के लिए समाधान भी अनुकूलित करना होगा।


4

Iframe उत्तरों का एक jQuery संस्करण:

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']);हालांकि, यह छवि फ़ाइलों को डाउनलोड करने के लिए काम नहीं करता है।
तहलवी

3

कोणीय समाधान:

एचटीएमएल

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

@ डमित्री नोगिन के उत्तर पर सुधार करने के लिए: इसने मेरे मामले में काम किया।

हालाँकि, इसका परीक्षण नहीं किया गया है, क्योंकि मुझे यकीन नहीं है कि विभिन्न ओएस / ब्राउज़र संयोजनों पर फ़ाइल संवाद कैसे काम करता है। (इस प्रकार सामुदायिक विकि)

<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, फ़ायरफ़ॉक्स, एज, क्रोम और क्रोम मोबाइल) में काम करता है। मेरे दस्तावेज़ कई चुनिंदा तत्वों में हैं। जब आप इसे बहुत तेज़ी से करने का प्रयास करते हैं, तो ब्राउज़र में समस्याएँ होती हैं ... इसलिए मैंने एक टाइमआउट का उपयोग किया।

//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 लाइब्रेरी बनाई। मुख्य अनूठी विशेषता यह है कि इसमें मेमोरी से कोई आकार सीमा नहीं है (सब कुछ स्ट्रीम किया गया है) और न ही ज़िप प्रारूप (यदि सामग्री 4GB से अधिक है तो यह zip64 का उपयोग करता है)।

चूंकि यह संपीड़न नहीं करता है, इसलिए यह बहुत अच्छा है।

पर "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

मैं ऐसा करने के लिए एक समाधान की तलाश कर रहा हूं, लेकिन जावास्क्रिप्ट में फ़ाइलों को खोलना उतना साफ नहीं था जितना मुझे पसंद था। मैंने फाइलों को एक सिंगल एसवीजी फाइल में इनकैप्सुलेट करने का फैसला किया।

यदि आपके पास सर्वर (I नहीं) पर संग्रहीत फ़ाइलें हैं, तो आप बस SVG में href सेट कर सकते हैं।

मेरे मामले में, मैं फ़ाइलों को बेस 64 में परिवर्तित करूँगा और उन्हें एसवीजी में एम्बेड करूँगा।

संपादित करें: एसवीजी ने बहुत अच्छा काम किया। यदि आप केवल फाइलें डाउनलोड करने जा रहे हैं, तो जिप बेहतर हो सकती है। यदि आप फ़ाइलों को प्रदर्शित करने जा रहे हैं, तो एसवीजी बेहतर लगता है।


0

Ajax घटकों का उपयोग करते समय कई डाउनलोड शुरू करना संभव है। इसलिए आपको https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow का उपयोग करना होगा

AJAXDownload का एक उदाहरण अपने पेज पर या जो भी जोड़ें। एक AjaxButton बनाएं और onSubmit को ओवरराइड करें। एक 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?!?!?!?!?!
नीलाजेक

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 फाइलों के साथ रखा जाएगा ।


क्या u rilly knead ayng [अंतिम एयरबेंडर] thuis के लिए ular / ???
नीलाजेक

0

Ajax कॉल के साथ url की सूची प्राप्त करना और फिर समानांतर कई फाइलें डाउनलोड करने के लिए 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

यहाँ मैं ऐसा कर रहा हूँ। मैं एक से अधिक ज़िप खोलता हूं, लेकिन अन्य प्रकार के डेटा (मैं पीडीएफ में प्रोजेट निर्यात करता हूं और उसी समय दस्तावेज़ के साथ कई ज़िप)।

मैं अपने कोड के पिछले हिस्से की नकल करता हूं। एक सूची में एक बटन से कॉल:

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

तो एक जेएस दिनचर्या (वेनिला नियम!) के लिए एक मूल कॉल। यहाँ जेएस दिनचर्या है:

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

चाल को ज़िप फ़ाइल का सीधा लिंक नहीं देना है, लेकिन इसे ब्राउज़र को भेजना है। ऐशे ही:

  $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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.