AEM:使用 JavaScript 使用 -API 访问 DAM 中的 JS 文件

AEM: Access JS File in DAM using JavaScript Use-API

我在 DAM 中有一个 JS 文件,其中包含 JSON。 我想在 Sightly 中使用 JavaScript USE API 的任何方法访问 helper JS 中的该文件。 我知道使用 Java 可以很容易地完成,但我想以一种我不想触及任何 Java 代码的方式来完成。

我试过如下的方法。但在那之后,输入流就无法将其转换为流数据。

request.resourceResolver.getResource("/path/to/dam/file.js");

request.resourceResolver.getResource("/path/to/dam/file.js").adaptTo(com.adobe.granite.asset.api.Asset);

我不确定是否有纯 JS 使用 API 方法允许您这样做。但是,由于 JS Use API 允许您使用 Java 类 和其中的方法,您应该能够使用它们来获取信息。

由于您的文件作为资产存储在 DAM 中,您需要从原始再现中访问数据。一种方法是使用 com.day.cq.dam.api.Asset API 来获取原始版本。 com.adobe.granite.asset.api.Asset 没有直接访问原始演绎版的方法,因此使用另一个。

工作样本custom.js

use(function (data) { 
    var asset = request.resourceResolver.getResource("/content/dam/we-retail/en/data.js").adaptTo(com.day.cq.dam.api.Asset);
    var is = asset.getOriginal().adaptTo(java.io.InputStream);
    var jsonData = JSON.parse(org.apache.commons.io.IOUtils.toString(is, "UTF-8"));
    console.log(jsonData);
    return jsonData;
});

DAM 中的文件内容

{
    "fname": "abc",
    "lname": "xyz"
}

HTL 文件

<sly data-sly-use.custom="custom.js">
    ${custom.fname} --> ${custom.lname}
</sly>

看到刚才贴出来的答案了。但是在看到这个之前,我用过另一种类似的方法。

就在这里。它与答案非常相似,但有一些额外的步骤。

asset = request.resourceResolver.getResource(jsonPath).adaptTo(com.day.cq.dam.api.Asset);
rend = asset.getOriginal().adaptTo(com.day.cq.dam.api.Rendition);

或直接

rend= request.resourceResolver.getResource(jsonPath+"/jcr:content/renditions/original").adaptTo(com.day.cq.dam.api.Rendition);

然后

inputStream = rend.adaptTo(java.io.InputStream);
var is;
var c = '';
var flag = false;
try {
// reads till the end of the stream
while ((is = inputStream.read()) != -1) {
      c = c + String.fromCharCode(is);
}

 } catch (e) {
   // if any I/O error occurs
   log.debug("Input Stream Error " + e)
 }

在尝试此处发布的现有解决方案时,我在从 DAM 读取任意文本文件时遇到问题;资源不想适应资产或再现。

折腾了一下,发现资源可以直接适配为InputStream。这是我想出的:

function readFileToString(location)
{
    var inputStream = request.resourceResolver.getResource(location).adaptTo(java.io.InputStream);
    var data = org.apache.commons.io.IOUtils.toString(inputStream, "UTF-8");

    return data + "";
}