我有以下代码将“ rose.gif”插入roseNode。但是,如何从存储库中检索文件?

    Node roseNode = session.getRootNode().getNode("wiki:encyclopedia/wiki:entry[1]/");

    File file = new File("rose.gif");
    MimeTable mt = MimeTable.getDefaultTable();
    String mimeType = mt.getContentTypeFor(file.getName());
    if (mimeType == null) mimeType = "application/octet-stream";

    Node fileNode = roseNode.addNode(file.getName(), "nt:file");

    System.out.println( fileNode.getName() );

    Node resNode = fileNode.addNode("jcr:content", "nt:resource");
    resNode.setProperty("jcr:mimeType", mimeType);
    resNode.setProperty("jcr:encoding", "");
    resNode.setProperty("jcr:data", new FileInputStream(file));
    Calendar lastModified = Calendar.getInstance();
    lastModified.setTimeInMillis(file.lastModified());
    resNode.setProperty("jcr:lastModified", lastModified);

    //retrieve file and output as rose-out.gif
    File outputFile = new File("rose-out.gif");
    FileOutputStream out = new FileOutputStream(outputFile);

最佳答案

您唯一需要做的就是从“ nt:file”节点的名称获取文件的名称,并从“ jcr:content”子节点的“ jcr:data”属性获取文件的内容。

JCR 1.0和2.0在获取二进制“ jcr:data”属性值的流方面有些不同。如果您使用的是JCR 1.0,则代码如下所示:

Node fileNode = // find this somehow
Node jcrContent = fileNode.getNode("jcr:content");
String fileName = fileNode.getName();
InputStream content = jcrContent.getProperty("jcr:data").getStream();


如果您使用的是JCR 2.0,那么最后一行会有所不同,因为首先必须从属性值中获取Binary对象:

InputStream content = jcrContent.getProperty("jcr:data").getBinary().getStream();


然后,您可以使用标准Java流实用程序将“内容”流中的字节写入文件中。

使用Binary对象完成操作后,请确保调用Binary的dispose()方法以告知信号您已完成Binary操作,并且实现可以释放Binary对象获取的所有资源。即使某些JCR实现尝试通过返回流(在关闭时将为您自动调用dispose())捕获错误,您也应该始终这样做。

关于file - 从JCR文件节点中获取文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4685959/

10-09 09:46