Получение приложений из документа - PullRequest
2 голосов
/ 15 февраля 2012

Это все, что мне нужно, ничего особенного: Я создаю URL из файлов, которые были прикреплены к документу, но документ не открыт. У меня есть страница, где я хочу показать вложения из конкретного документа. Как мне это сделать?

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 08 октября 2012

Я обнаружил, что DominoDocument.AttachmentValueHolder.getHref() работает для получения URL-адреса прикрепленного файла или изображения, если у вас есть дескриптор документа. Например:

<xp:image
   id="image1">
   <xp:this.url>
      <![CDATA[#{javascript:document1.getAttachmentList("Body").get(0).getHref()}]]>
   </xp:this.url>
</xp:image>

Вам нужно будет обрабатывать несколько вложений, перебирая элементы, возвращаемые из getAttachmentList().

6 голосов
/ 15 февраля 2012

Самый простой способ - использовать @AttachmentNames (в столбце представления) для получения имен файлов. Затем вы можете создать URL, используя db.nsf / 0 / unid / $ file / [filename] - это классика, не будет работать в XPiNC. Существует второй синтаксис URL (необходимо проверить), специфичный для XPages:

HTTP (s): // [ваш_сервер] / [application.nsf] /xsp/.ibmmodres/domino/OpenAttachment/ [application.nsf] / [UNID | / $ File / [AttachmentName] Открыть

Прочитайте мою полную статью об этом здесь: http://www.wissel.net/blog/d6plinks/SHWL-86QKNM

(включает образец SSJS)

1 голос
/ 20 декабря 2012

Если вы можете использовать Java (как в XPages), тогда

    import com.ibm.xsp.extlib.util.ExtLibUtil;
    import lotus.domino.MIMEEntity;
    import lotus.domino.Document;
    import lotus.domino.Session;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.Serializable;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Vector;
    import lotus.domino.Database;
    import lotus.domino.DocumentCollection;
    import lotus.domino.EmbeddedObject;
    import lotus.domino.Item;
    import lotus.domino.MIMEHeader;
    import lotus.domino.NotesException;
    import lotus.domino.RichTextNavigator;
    import lotus.domino.RichTextItem;
    import lotus.domino.Stream;
    import lotus.domino.View;
    // ...
    private String fileSeparator = File.separator;
    private String tempPath = System.getProperty("java.io.tmpdir") + fileSeparator + "Temp" + fileSeparator;
    // ...
    private void saveFilesFromDoc(Document doc) throws NotesException {
    if (doc.hasEmbedded()) {
        RichTextItem body = null;
        try {
            body = (RichTextItem) doc.getFirstItem("body");
        } catch (ClassCastException e) {
            // save file from MIME (Rich text is converted to MIME)
            MIMEEntity mime = doc.getMIMEEntity();
            findMimeWithFile(mime);
            return;
        }
        if (body != null) {
            // save file from richtext
            RichTextNavigator rtnav = body.createNavigator();
            if (rtnav.findFirstElement(RichTextItem.RTELEM_TYPE_FILEATTACHMENT)) {
                do {
                    EmbeddedObject att = (EmbeddedObject) rtnav.getElement();
                    String fileName = att.getSource();
                    fileName = notConflictFileName(fileName );
                    String path = tempPath + fileName ;
                    att.extractFile(path);
                } while (rtnav.findNextElement());
            }
        } else {
            // ("BODY is NULL");
        }
    }

Получить файл из richtext, преобразованного в Mime

private void findMimeWithFile(MIMEEntity mime) {
    try {
        askMimeForFiles(mime, "");
        MIMEEntity child = mime.getFirstChildEntity();
        while (child != null) {
            askMimeForFiles(child, "child");
            // String encoding = "ISO-8859-2";
            String c = child.getContentType();
            MIMEEntity subChild = child.getFirstChildEntity();
            askMimeForFiles(subChild, "subChild");
            if ("multipart".equals(c)) {
                while (subChild != null) {
                    askMimeForFiles(subChild, "subChild2");
                    // String sc = subChild.getContentType();
                    subChild = subChild.getNextSibling();
                }
            }
            child = child.getNextSibling();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Выясните, является ли объект MIME вложенным файлом (или каким-либо текстом)

private void askMimeForFiles(MIMEEntity mime, String prefix) throws NotesException {
    if (mime != null) {
        boolean thisMimeHasFile = false;
        String fileName = "noname";
        Vector<MIMEHeader> headers = mime.getHeaderObjects();
        for (MIMEHeader header : headers) {
            // (prefix + "-header: " + header.getHeaderName() + " :: " + header.getHeaderValAndParams());
            if ("Content-Transfer-Encoding".equals(header.getHeaderName())) {
                if ("binary".equals(header.getHeaderVal())) {
                    thisMimeHasFile = true;
                }
            }
            if ("Content-Disposition".equals(header.getHeaderName())) {
                String val = header.getHeaderValAndParams();
                int odd = val.indexOf("filename=") + "filename=".length();
                int doo = val.length();
                fileName = val.substring(odd, doo);
                this.fileNames.add(fileName);
            }
        }
        if (thisMimeHasFile) {
            safeFilesFromMIME(mime, fileName);
        }
    }
}

Если MIME является вложенным файлом, сохраните его

private void safeFilesFromMIME(MIMEEntity mime, String fileName) throws NotesException {
    Session session = ExtLibUtil.getCurrentSession(); // or user variableResolver
    Stream stream = session.createStream();
    String pathname = tempPath + fileName;
    stream.open(pathname, "binary");
    mime.getContentAsBytes(stream);
    stream.close();
}
...