我有一个门户,用户可以在其中登录并看到一堆按年份和类别分类的文档。他们希望每个文档旁边都有一个复选框,以便他们可以选择一个或多个文档,然后按一个按钮下载所选文档中的所有文件。
每个文档只有一个文件。
有没有一种简单的方法来编写这样的程序?
您要一次从选定文档下载所有附件。
创建包含所有附件的压缩文件并下载该压缩文件。
您可以找到从文档附件in Naveen Maurya's XSnippet创建Zip文件的代码。
扩展此代码的方式是遍历所有选定的文档并从中获取附件。
使用XPage按钮中所有选定文档的ID设置一个会话作用域变量,然后打开XPage zip.xsp(XSnipket的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,获取文档及其附件,并将它们全部放入一个压缩文件中。
...
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)
可以一次下载所有文件:
这是一个有效的示例代码:
<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>
但是,如果您有很多附件,这个替代解决方案会让人感觉有点乱...