Есть ли простой способ разрешить пользователю загружать файлы в выбранных документах из viewPanel?

У меня есть портал, на котором пользователи входят и видят кучу документов, отсортированных по категориям по годам и категориям. Им нужен флажок рядом с каждым документом, чтобы они могли выбрать один или несколько документов, а затем нажать кнопку, чтобы загрузить все файлы из выбранных документов.

В одном документе только один файл.

Есть ли простой способ запрограммировать такую ​​вещь?

2 ответа

Вы хотите загрузить вложения из выбранных документов одновременно.

Создайте zip- файл, содержащий все вложения, и загрузите один zip-файл.

Вы можете найти код для создания почтового файла из вложений документа в XSnippet Навина Маурьи.

Расширьте этот код так, чтобы вы просматривали все выбранные документы и извлекали оттуда вложения.

Установите переменную области действия сеанса с идентификаторами всех выбранных документов в кнопке вашего XPage и откройте XPage zip.xsp (XAgent XSnippet)

<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, получите документы и их вложения и поместите их все в один 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) на стороне клиента:

  • собрать все URL вложения на стороне сервера
  • напишите те в скрытом поле ввода
  • выполнить код CSJS в событии onComplete, чтобы открыть каждый 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>

Но это альтернативное решение выглядит немного грязно, если у вас много вложений...

Так что я наконец понял это. Используя комбинацию кода zip-файла из XSnippet Навина Маурьи. и некоторый код Java, найденный здесь. Я опубликую мой окончательный код после завершения.

Оказывается, мне не нужно скачивать прикрепленные документы, а файлы из файловой системы серверов.

Другие вопросы по тегам