gpt4 book ai didi

aem - 如何写一个nt :file programmatically

转载 作者:行者123 更新时间:2023-12-01 00:56:49 26 4
gpt4 key购买 nike

我正在尝试将二进制数据存储在动态创建的 JCR 中。我的问题是 JCR API 提供的唯一方法是通过 InputStream :

Session session = request.getResourceResolver().adaptTo(Session.class);
ValueFactory valueFactory = session.getValueFactory();
Binary bin = valueFactory.createBinary(is);

由于 CQ/Sling 是 RESTful,我可以理解为什么会出现这种情况,因为您通常会收到一个表单帖子或一个 httprequest 到另一个来源,在那里您总是有一个 InputStream使用。但就我而言,我正在动态创建二进制文件,通常表示为 OutputStream .
  • 我在 JCR API 中是否有其他方法可以创建 OutputStream直接在nt:file节点上,就像FileOutputStream ?
  • 如果没有,是否有一种简单的方法来获得 OutpuStream转换为 InputStream ?

  • 我知道另一种方式可以从 Apache Commons 获得 IOUtils.copy() .我在 SO 上看到了一些例子,他们只使用 ByteArrayOutputStream.toByteArray()创建一个 InputStream .但由于数据可能会变得相当大,这不是一个好的解决方案。此外我试过了,不知何故流不完整,所以似乎有一个缓冲区限制。下一个方法是使用管道流,但我还有其他问题,我提出了另一个问题: Multiple quotes cause PipedOutputStream/OutputStreamWriter to fail

    编辑:
    删除了 PipedStream 代码示例,因为我在另一个问题中发布了该问题。所以在这里我仍然只是在寻找一种简单的方法来创建一个 nt:file,其中输入不是 InputStream .

    最佳答案

    管道在这里是很好的解决方案。但是,为了正确实现它们,您必须使用两个线程:首先应该将数据写入PipedOutputStream第二个应该创建一个 Binary来自 PipedInputStream并将其保存到 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();

    在新线程中处理 JCR 的对称解决方案也很好。

    关于aem - 如何写一个nt :file programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27170741/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com