【问题标题】:AEM: Access JS File in DAM using JavaScript Use-APIAEM:使用 JavaScript Use-API 访问 DAM 中的 JS 文件
【发布时间】:2019-10-08 18:08:57
【问题描述】:

我在 DAM 中有一个特定的 JS 文件,其中包含一个 JSON。 我想在 Sightly 中使用 JavaScript USE API 的任何方法访问帮助程序 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);

【问题讨论】:

  • 随机提示:如果您的文件包含 JSON,那么它应该是 .json 文件而不是 .js ;)
  • 感谢您的提示。甚至我也在考虑这个,但它是从第三方渲染的。我会把它传递给他们下次使用 .json :D

标签: javascript aem sightly


【解决方案1】:

我看到了刚刚发布的答案。但是在看到这个之前,我已经使用了另一种类似的方法。

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

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)
 }

【讨论】:

    【解决方案2】:

    我不确定是否有纯 JS Use 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>
    

    【讨论】:

      【解决方案3】:

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

      折腾了一下,发现资源可以直接适配一个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 + "";
      }
      

      【讨论】:

      • return data + ""; 连接是否必要?我假设它是用于识别 EOF(文件结尾)或什么的?还是只是以防万一data 为空?
      • @bigp 这是因为我希望返回值是 javascript 字符串,而不是对 java 字符串的引用。这种转换会在以后自动发生,但我已经养成了尽快强制转换的习惯。我发现它更容易追踪错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2017-02-04
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多