如何访问存储为MIME部分的附件?

时间:2014-07-23 19:10:40

标签: java xpages bufferedimage

在我看来,有两种方法可以在NotesDocument中存储附件。

作为RichTextField或“MIME部分”。

如果它们存储为RichText,您可以执行以下操作:

document.getAttachment(文件名)

这似乎不适用于存储为MIME部分的附件。见截图 enter image description here

我在后端有数千个这样的文档。这不是一个UI问题,我需要使用XPages的下载控件文件。

每个文件只有1个附件。一个图像。一个JPG文件。我有3个不同大小的数据库。原创,大型和小型。最初我从包含存储为RichText的附件的文档中创建了所有内容。但我的代码将它们保存为MIME部分。这就是它的作用。不是我的意图。

发生了什么事我丢失了一些“小”图片,所以我需要从现在存储为MIME部分的原始图片重建它们。因此,我的最终目标是将它从NotesDocument转换为Java缓冲图像。

我认为我有代码可以做我想要的但是我只是“简单地”无法弄清楚如何从文档中获取附件然后进入Java缓冲图像。

下面是我正在使用的一些粗略代码。我的目标是用原始图片传递文档。我已经拥有了fileName,因为我将其存储在metaData中。但我不知道如何从文件本身那里得到它。我正在传递“小”以创建小图像。

我想我只是不知道如何处理以这种方式存储的附件。

任何想法/建议将不胜感激!感谢!!!

public Document processImage(Document inputDoc, String fileName, String size) throws IOException {
    // fileName is the name of the attachment on the document
    // The goal is to return a NEW BLANK document with the image on it
    // The Calling code can then deal with keys and meta data.

// size is "Original", "Large" or "Small"
System.out.println("Processing Image,  Size = " + size);
//System.out.println("Filename = " + fileName);

boolean result = false;

Session session = Factory.getSession();
Database db = session.getCurrentDatabase();
session.setConvertMime(true);

BufferedImage img;
BufferedImage convertedImage = null;  // the output image

EmbeddedObject image = null;
InputStream imageStream = null;

int currentSize = 0;
int newWidth = 0;
String currentName = "";


try {
    // Get the Embedded Object
    image = inputDoc.getAttachment(fileName);
    System.out.println("Input Form : " + inputDoc.getItemValueString("form"));

    if (null == image) {
        System.out.println("ALERT - IMAGE IS NULL");
    }


    currentSize = image.getFileSize();
    currentName = image.getName();


    // Get a Stream of the Imahe
    imageStream = image.getInputStream();
    img = ImageIO.read(imageStream);  // this is the buffered image we'll work with
    imageStream.close();


    Document newDoc = db.createDocument();
    // Remember this is a BLANK document. The calling code needs to set the form


    if ("original".equalsIgnoreCase(size)) {
        this.attachImage(newDoc, img, fileName, "JPG");
        return newDoc;
    }

    if ("Large".equalsIgnoreCase(size)) {
        // Now we need to convert the LARGE image
        // We're assuming FIXED HEIGHT of 600px
        newWidth = this.getNewWidth(img.getHeight(), img.getWidth(), 600);
        convertedImage = this.getScaledInstance(img, newWidth, 600, false);
        this.attachImage(newDoc, img, fileName, "JPG");
        return newDoc;

    }

    if ("Small".equalsIgnoreCase(size)) {
        System.out.println("converting Small");
        newWidth = this.getNewWidth(img.getHeight(), img.getWidth(), 240);
        convertedImage = this.getScaledInstance(img, newWidth, 240, false);
        this.attachImage(newDoc, img, fileName, "JPG");
        System.out.println("End Converting Small");
        return newDoc;

    }

    return newDoc;




} catch (Exception e) {
    // HANDLE EXCEPTION HERE
    // SAMLPLE WRITE TO LOG.NSF
    System.out.println("****************");
    System.out.println("EXCEPTION IN processImage()");
    System.out.println("****************");
    System.out.println("picName: " + fileName);
    e.printStackTrace();
    return null;

} finally {
    if (null != imageStream) {
        imageStream.close();
    }
    if (null != image) {
        LibraryUtils.incinerate(image);
    }

}

}

2 个答案:

答案 0 :(得分:2)

我相信这将是以下代码段的一些变体。您可能必须更改哪个mimeentity具有内容,以便它可能在父级或另一个子级中。

Stream stream = session.createStream();
doc.getMIMEEntity().getFirstChildEntity().getContentAsBytes(stream);
ByteArrayInputStream bais = new ByteArrayInputStream(stream.read());
return ImageIO.read(bais);

编辑:

 session.setConvertMime(false);
  Stream stream = session.createStream();
  Item itm = doc.getFirstItem("ParentEntity");
  MIMEEntity me = itm.getMIMEEntity();
  MIMEEntity childEntity = me.getFirstChildEntity();
  childEntity.getContentAsBytes(stream);
  ByteArrayOutputStream bo = new ByteArrayOutputStream();
  stream.getContents(bo);
  byte[] mybytearray = bo.toByteArray();
  ByteArrayInputStream bais = new ByteArrayInputStream(mybytearray);
  return ImageIO.read(bais);

答案 1 :(得分:0)

David看看DominoDocument,http://public.dhe.ibm.com/software/dw/lotus/Domino-Designer/JavaDocs/XPagesExtAPI/8.5.2/com/ibm/xsp/model/domino/wrapped/DominoDocument.html

在那里你可以包装每个Notes文档 在DominoDocument中,有DominoDocument.AttachmentValueHolder,您可以在其中访问附件。 我在Engage解释了它。它非常强大 http://www.slideshare.net/flinden68/engage-use-notes-objects-in-memory-and-other-useful-java-tips-for-x-pages-development