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 + "";
}
我在 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 + "";
}