我正在尝试将Box.com帐户中的文件同步到AEM(CQ5)DAM。我已经编写了一个服务,我可以在Box.com上验证并获取文件。但是为了让我将它们上传到AEM DAM,我需要将文件作为InputStream。在Box.com文档(https://github.com/box/box-java-sdk/blob/master/doc/files.md)上,我找到了下载文件的代码片段。
BoxFile file = new BoxFile(api, "id");
BoxFile.Info info = file.getInfo();
FileOutputStream stream = new FileOutputStream(info.getName());
file.download(stream);
stream.close();
但我找不到任何可以在Inputstream中获取文件的内容,以便我可以使用它将其上传到AEM DAM。当我尝试从OutputStream转换为Inputstream时,它只是没有真正工作并在AEM中创建ZERO字节文件。
任何指针和帮助都非常感谢!
提前致谢。
答案 0 :(得分:1)
我遇到了类似的问题,我尝试在CQ中创建CSV并将其存储在JCR中。解决方案是管道流:
final PipedInputStream pis = new PipedInputStream();
final PipedOutputStream pos = new PipedOutputStream(pis);
虽然我之后使用OutputStreamWriter写入输出流,但FileOutputStream.download也可以正常工作。
要实际写入JCR,您需要ValueFactory,您可以从JCR会话中获取(这里是我的CSV示例):
ValueFactory valueFactory = session.getValueFactory();
Node fileNode = logNode.addNode("log.csv", "nt:file");
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty("jcr:mimeType", "text/plain");
resNode.setProperty("jcr:data", valueFactory.createBinary(pis));
session.save();
编辑:BoxFile未经测试的例子:
try {
AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);
BoxFile file = new BoxFile(api, "id");
BoxFile.Info info = file.getInfo();
final PipedInputStream pis = new PipedInputStream();
final PipedOutputStream pos = new PipedOutputStream(pis);
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
file.download(pos);
}
});
Asset asset = assetManager.createAsset(info.getName(), pis, info.getMimeType(), true);
IOUtils.closeQuietly(pos);
IOUtils.closeQuietly(pis);
} catch (IOException e) {
LOGGER.error("could not download file: ", e);
}
答案 1 :(得分:0)
如果我正确理解了代码,您将文件下载到名为info.getName()的文件中。尝试使用 FileInputStream(info.getName())从下载的文件中获取输入流。
BoxFile file = new BoxFile(api, "id");
BoxFile.Info info = file.getInfo();
FileOutputStream stream = new FileOutputStream(info.getName());
file.download(stream);
stream.close();
InputStream inStream=new FileInputStream(info.getName());