是否有一种简单的方法允许用户从viewPanel下载所选文档中的文件?

Bit*_*se1 0 xpages

我有一个门户网站,用户登录并查看按年份和类别排序和分类的一堆文档.他们想要每个文档旁边的复选框,以便他们可以选择一个或多个文档,然后按一个按钮从所选文档下载所有文件.

每个文档只有一个文件.

有没有一种简单的方法来编程这样的东西?

Knu*_*ann 5

您想一次从所选文档下载附件.

创建一个包含所有附件的zip文件,然后下载一个zip文件.

您可以在Naveen Maurya的XSnippet中找到用于从文档附件创建zip文件的代码.

以您运行所有选定文档的方式扩展此代码,并从那里获取附件.

使用XPage按钮中所有选定文档的ID设置会话范围变量,并打开XPage zip.xsp(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>
Run Code Online (Sandbox Code Playgroud)

从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++) {
        ...
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您可以window.open(url)在客户端一次下载所有文件:

  • 收集服务器端的所有附件的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>
Run Code Online (Sandbox Code Playgroud)

但是,如果你有很多附件,这个替代解决方案会有点麻烦......