Sling:查明资源是否是图像

Sling: Find out if resource is an image

我有一个完全设置的 CQ5/AEM 应用程序,我应该生成一个 sitemap.xml。到目前为止,还不错。

我有所有页面的列表,但其中一些页面实际上是图像。我的问题:如何确定页面是否实际上是图像?两者都有 jcr:primaryType=cq:Page

public void getMoreChildren(HttpServletRequest request, JspWriter out, Page incomingChildPage) {
        Iterator<Page> childPageChildren = incomingChildPage.listChildren();
        while (childPageChildren.hasNext()) {
            Page childPage = childPageChildren.next();
            String pagePath = childPage.getPath();
            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest)request;

            ResourceResolver resourceResolver = slingRequest.getResourceResolver();
            Externalizer externalizer = resourceResolver.adaptTo(Externalizer.class);

            String externalUrl = externalizer.publishLink(resourceResolver,pagePath) + ".html";
            //do things with data so far
            getMoreChildren(request, out, childPage);
        }
}

所有这些都在 JSP 中运行,并且到目前为止它应该做的事情,除了它将图像视为页面并且我想忽略图像文件。我需要做什么?

存储在 DAM 中的图像应该有 jcr:primaryType=dam:Asset。也就是说,您应该能够检查这些属性:

jcr:content
    jcr:primaryType=cq:PageContent
    cq:template=/apps/yourApp/yourTemplate

图像不会有 jcr:content/cq:template 属性,也不会有 jcr:content/jcr:primaryType 属性 cq:PageContent.

这些属性存在于 jcr:content 节点下。尝试点击两个示例 url——一个用于图像,一个用于常规页面——但将“.infinity.json”添加到 URL 的末尾。这将向您显示每个图像的属性,以便您可以找到有助于过滤图像的东西。

如果两者都有 jcr:primaryType=cq:Page,那么您可能需要重新考虑构建应用程序的方式。 图像应该从 DAM 加载,或者在任何地方,它应该有 jcr:primaryType= dam:Asset 这个 dam:Asset 节点将有一个 jcr:content 类型 = dam:AssetContent ,它将包含元数据节点,这个元数据节点将有一个 属性 类型的 dc:format,它将通知您有关文件类型的信息..

我知道这个问题有点老了,似乎 AEM 中的某些内容也发生了变化。

我一直在寻找如何确定 DAM 中的资产是否也是图像,而不使用我自己的实用程序来检查 mime 类型。我最终找到了一种内置的方法来做到这一点。有一个实用程序名称DamUtil,上面有各种有用的东西。回答 OP 问题所需的方法是 isImage().

Resource resource = resourceResolver.resolve("/content/dam/we-retail/en/people/womens/women_2.jpg");
Asset asset = resource.adaptTo(Asset.class);

if(com.day.cq.dam.commons.util.DamUtil.isImage(asset)) {
    Log.debug("Found and image at: {}", asset.getPath())
}