2015-10-05 53 views
0

我有一個門戶,用戶登錄後可以看到一堆按年份和類別排序和分類的文檔。他們希望每個文檔旁邊有一個複選框,以便他們可以選擇一個或多個文檔,然後按下按鈕從所選文檔下載所有文件。有沒有一種簡單的方法來允許用戶從viewPanel下載選定文檔中的文件?

每個文檔只有一個文件。

有沒有簡單的方法來編程這樣的事情?

+1

[Google上的前四個鏈接](http://bfy.tw/28Le)給出了一些關於如何執行此操作的非常好的信息。如果你想鏈接到文檔中的_first_附件,請查看[Paul Withers關於該主題的博客文章](http://www.intec.co.uk/xpages-open-first-attachment-in-視圖/)。該谷歌搜索的第四個鏈接顯示,這個問題可能是http://stackoverflow.com/questions/27495491/attachment-download-from-view的可能重複。 –

+0

感謝谷歌幫助埃裏克。大聲笑。我希望找到一個允許在視圖頂部有一個按鈕的例子,它會從每個選定的文檔中下載一個文件(使用複選框)。我有一個想法如何走選定的文件列表(我認爲),但不知道如何調用每個文件的下載。 我希望有人已經這樣做,並不介意共享一些代碼,我不必重新發明輪子可言。 – Bitwyse1

+0

我很高興讚賞:-P無論如何,我喜歡克努特的答案,尤其是拉鍊是多重附件的事實標準。 –

回答

5

您想一次下載所選文檔的附件。

創建一個zip包含所有附件並下載一個zip文件的文件。

您可以從文檔的附件in Naveen Maurya's XSnippet中找到用於創建zip文件的代碼。

以一種方式擴展此代碼,您可以瀏覽所有選定的文檔並從中獲取附件。

設置在您的XPage的按鈕和開放的XPage zip.xsp所有選定文件的的ID(XSnippet的XAgent)

<xp:button 
    id="button1" 
    value="Download"> 
    <xp:eventHandler 
     event="onclick" 
     submit="true" 
     refreshMode="norefresh"> 
     <xp:this.action> 
      <xp:actionGroup> 
       <xp:executeScript> 
        <xp:this.script><![CDATA[#{javascript: 
         var viewPanel = getComponent("viewPanel1"); 
         sessionScope.selectedIds = viewPanel.getSelectedIds(); 
         }]]></xp:this.script> 
       </xp:executeScript> 
       <xp:openPage name="/zip.xsp"></xp:openPage> 
      </xp:actionGroup> 
     </xp:this.action> 
    </xp:eventHandler> 
</xp:button> 

從zip.xsp會話範圍讀取ID的會話範圍的變量,得到文檔及其附件,並將它們全部放在一個zip文件中。

... 
var selectedIds = sessionScope.selectedIds; 
for(i=0; i < selectedIds.length; i++) { 
    var doc:NotesDocument = database.getDocumentByID(selectedIds[i]); 
    var attachments:java.util.Vector = session.evaluate("@AttachmentNames", doc); 
    // Loop through all the attachments 
    for (var i = 0; i < attachments.size(); i++) { 
     ... 

作爲替代,你可以一次下載的所有文件與多個window.open(url)在客戶端:

  • 收集所有附件的服務器端
  • 網址寫那些在隱藏輸入字段
  • 在onComplete事件中執行CSJS代碼以在單獨的窗口中打開每個URL

這是一個工作示例代碼:

<xp:button 
    id="button1" 
    value="Download"> 
    <xp:eventHandler 
     event="onclick" 
     submit="true" 
     refreshMode="partial" 
     refreshId="panelDownloadURLs"> 
     <xp:this.action><![CDATA[#{javascript:var viewPanel = getComponent("viewPanel1"); 
      var selectedIDs = viewPanel.getSelectedIds(); 
      var filesToDownload = ""; 
      for(i=0; i < selectedIDs.length; i++) { 
       var doc:NotesDocument = database.getDocumentByID(selectedIDs[i]); 
       var attachments:java.util.Vector = session.evaluate("@AttachmentNames", doc); 
       for (var i = 0; i < attachments.size(); i++) { 
        var attachment = doc.getAttachment(attachments.get(i).toString()); 
        if (attachment != null) { 
         filesToDownload += context.getUrl().getAddress().replace(view.getPageName(), '') + 
          '/0/' + doc.getUniversalID() + '/$FILE/' + attachment.getName() + '#'; 
        } 
       } 
      } 
      getComponent("inputDownloadURLs").setValue(filesToDownload);}]]></xp:this.action> 
     <xp:this.onComplete><![CDATA[ 
      var filesToDownload = dojo.byId("#{id:inputDownloadURLs}").value.split("#"); 
      for (var i = 0; i < filesToDownload.length; i++) { 
       if (!filesToDownload[i].toString() == "") { 
        window.open(filesToDownload[i]); 
       } 
      }]]></xp:this.onComplete> 
    </xp:eventHandler> 
</xp:button> 
<xp:panel 
    id="panelDownloadURLs"> 
    <xp:inputHidden 
     id="inputDownloadURLs" 
     value=""></xp:inputHidden> 
</xp:panel> 

但是,這個替代解決方案感覺有點混亂,如果你有很多附件...

+0

這是行不通的。這是一個審計門戶,可以下載幾十或幾百個文件。 – Bitwyse1

+0

@ Bitwyse1您將同一個主體應用於單個文檔的附件。這與Knut所制定的幾乎完全相同,但是從那天起,該行文檔的一個按鈕就被調用。 –

+0

郵政解決方案在您的情況下是完美的。我添加了一些代碼片段來展示如何擴展zip XSnippet。 –

0

所以,我終於想通了這一點。使用Naveen Maurya's XSnippet.中的zip文件代碼和一些java code found here的組合。我會在完成後發佈我的最終代碼。

事實證明,我並不需要從服務器文件系統下載附加的文件而不是文件。

相關問題