从 JCR 文件节点中获取文件
Posted
技术标签:
【中文标题】从 JCR 文件节点中获取文件【英文标题】:Get File Out of JCR File Node 【发布时间】:2011-06-08 19:53:19 【问题描述】:我有以下代码将“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);
【问题讨论】:
【参考方案1】:您真正需要做的唯一事情是从“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()
。
【讨论】:
嗨 Randall,我想要的是 OutputStream 而不是输入流。这可能吗? 我想通了。只是将 inputStream 逐字节转换为 outputStream。 对于 2.0,我认为您必须在使用 Binary 对象 (day.com/specs/jcr/2.0/5_Reading.html) 完成后调用 Binary.dispose()。以上是关于从 JCR 文件节点中获取文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Querybuilder 从全文搜索父路径中排除子路径或从 XPATH/JCR SQL2 查询中获取搜索命中摘录
Magnolia defaultAction 与从操作栏中单击实际操作在获取 JCR 项目方面的区别
在 Magnolia/JCR-SQL2 中获取所有兄弟姐妹,前一个和下一个