2015-10-05 52 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的组合。我会在完成后发布我的最终代码。

事实证明,我并不需要从服务器文件系统下载附加的文件而不是文件。