2011-01-13 100 views
12

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

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); 

回答

16

你真正需要做的唯一的事情是得到了“NT:文件”的名称的文件的名称节点,并从该文件的内容“JCR:数据”属性的“jcr:content”子节点。

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,最后一行是有点不同,因为首先必须从物业得到的二进制对象值:

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

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

当你完成二进制对象时,一定要调用二进制的dispose()方法来告诉你已经完成二进制的信号,并且实现可以释放二进制对象获取的所有资源。即使某些JCR实现尝试通过返回一个流,在关闭时会自动为您调用dispose(),您应该始终这样做。

+0

嗨Randall,我想要的是一个OutputStream而不是输入流。这可能吗? – Steve 2011-01-14 16:50:31