我正在尝试将二进制数据存储在 JCR 中,这是动态创建的。我的问题是 JCR API 提供的唯一方法是通过InputStream:
Session session = request.getResourceResolver().adaptTo(Session.class);
ValueFactory valueFactory = session.getValueFactory();
Binary bin = valueFactory.createBinary(is);
Run Code Online (Sandbox Code Playgroud)
由于 CQ/Sling 是 RESTful,我可以理解为什么会出现这种情况,因为您通常会收到一个表单帖子或一个到另一个源的 httprequest,您总是可以InputStream使用它。但就我而言,我正在动态创建二进制文件,它通常表示为OutputStream.
OutputStream直接在 nt:file 节点上创建一个,就像一个FileOutputStream?OutpuStream转换为 a InputStream?我知道 Apache Commons 提供了另一种方法IOUtils.copy()。我见过一些关于 SO 的例子,他们只是使用来ByteArrayOutputStream.toByteArray()创建一个InputStream. 但由于数据可能变得相当大,这不是一个好的解决方案。此外,我尝试了它,但不知何故,流不完整,所以似乎存在缓冲区限制。下一个方法是使用管道流,但是我还有其他问题,我提出了另一个问题:Multiple Quotes Cause PipedOutputStream/OutputStreamWriter to failed
编辑:删除了 PipedStream 代码示例,因为我在另一个问题中发布了该问题。所以在这里我仍然只是在寻找一种简单的方法来创建 nt:file,其中输入不是InputStream.
管道是这里很好的解决方案。但是,为了正确实现它们,您必须使用两个线程:第一个应该将数据写入PipedOutputStream,第二个应该创建一个BinaryfromPipedInputStream并将其保存到 JCR 中:
final PipedInputStream pis = new PipedInputStream();
final PipedOutputStream pos = new PipedOutputStream(pis);
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
try {
OutputStreamWriter writer = new OutputStreamWriter(pos);
writer.append("append here some data");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
Binary binary = session.getValueFactory().createBinary(pis);
session.getNode("/content/myNode").setProperty("xyz", binary);
session.save();
Run Code Online (Sandbox Code Playgroud)
在新线程中处理 JCR 的对称解决方案也不错。
| 归档时间: |
|
| 查看次数: |
4593 次 |
| 最近记录: |