2014-12-22 44 views
0

我正在實施數字內容的結帳流程。當用戶下訂單時,我會向他展示他購買的所有產品以及產品旁邊的下載鏈接。我的客戶希望當成功頁面被加載時,所有的產品都應該自動下載。強制使用jquery下載所有<a>標記上的文件

以下是代碼片段:頁面的

HTML代碼段有產品

<p>Some digital product name</p> 
<a class='digital-download' href="<?php echo Yii::app()->request->getBaseUrl('true'); ?>/site/downloadfile/filename/<?php echo $digital_download['filename']; ?>">Click here download</a> 

我對發起文件的下載動作的PHP代碼(downloadfile行動的下載鏈接):

public function actionDownloadFile($filename) { 
    $file = Yii::app()->request->getBaseUrl(true) . '/upload/digitaluploads/' . $filename; //file location 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="' . basename($file) . '"'); 
    readfile($file); 
} 

現在,因爲我的客戶希望加載的頁面時的所有文件會自動下載,我嘗試使用以下的jQuery:

$(document).ready(function() {  
    $('.digital-download').each(function() { 
     var download_link = $(this).attr("href"); 
     window.location = download_link; 
    }); 
}); 

問題:

它只啓動第一個文件,其他文件下載的下載沒有啓動。此外下面的jQuery事件根本不起作用:

$(document).ready(function() { 
    $('.digital-download').each(function() { 
     $(this).click(); 
    }); 
}); 

任何解決方案?

+3

這可能是一個更好的解決方案,在包含所有文件的服務器上創建一個zip文件然後將其作爲單個文件下載。 –

+0

不是我想要的。客戶希望每個購買的產品都單獨下載。 – Hammad

回答

1

在我看來最好的解決方法是使用iframes

$('a.digital-download').each(function(){ 
    $('<iframe></iframe>', {src: $(this).attr('href')}) 
     .css({ 
      width:0, 
      height:0, 
      border:'none' 
     }) 
     .appendTo('body'); 
}); 

文件將在其中加載和下載將開始

編輯:最近不得不作出這個解決方案工作,純JavaScript

var body = document.getElementsByTagName('body'), 
    elements = document.getElementsByClassName('digital-download'), 
    element, src; 
for(var I in elements) 
{ 
    if(elements.hasOwnProperty(I) && elements[I].attributes.length > 0) 
    { 
     src = null; 
     for(var O in elements[I].attributes) 
     { 
      if(elements[I].attributes.hasOwnProperty(O) && elements[I].attributes[O].name == 'href') 
      { 
       src = elements[I].attributes[O].value; 
      } 
     } 
     if(typeof src != 'undefined' && null !== src) 
     { 
      element = document.createElement('iframe'); 
      element.style.width = 0; 
      element.style.height = 0; 
      element.style.borderWidth = 0; 
      body[0].appendChild(element); 
      element.src = src; 
     } 
    } 
} 
+0

很棒...爲我工作。但是,你能解釋一下它啓動下載的邏輯嗎?以及appendTo如何與此相關? – Hammad

+0

Iframes像嵌入式窗口一樣工作,它們請求你在'src'屬性中給出的頁面,並且作爲響應頭部包含'Content-Type:application/octet-stream'瀏覽器開始下載給定的內容,就像它們在普通窗口中一樣。 正如您所看到的,我使用了樣式來使其爲0x0px且沒有邊框,因此無論如何它都不會隱藏但不可見,因爲如果某些瀏覽器被「display」或「visibility」屬性隱藏,則會忽略iframe。 通過使用帶有完整標籤的jQuery構造函數'$('