You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AEM as a Cloud Service资产预验证OSGI服务方案咨询

AEM as a Cloud Service 资产预处理验证方案

针对你需要在Asset Compute服务启动前执行资产验证的需求,推荐以下两种标准扩展方案,均基于OSGI服务实现:

1. 实现 AssetPreProcessor 接口(推荐)

这是AEM官方提供的资产上传/创建前置扩展点,会在资产持久化到JCR、触发Asset Compute处理之前执行,是最直接的预处理验证方案。

核心逻辑

  • 实现com.day.cq.dam.api.asset.AssetPreProcessor接口,注册为OSGI服务
  • 在process方法中获取上传资产的文件名、目标路径等上下文信息
  • 执行自定义验证规则(命名规范、路径限制)
  • 验证不通过时抛出AssetProcessingException,中断资产上传流程,Asset Compute不会启动

代码示例

import com.day.cq.dam.api.asset.AssetPreProcessor;
import com.day.cq.dam.api.asset.AssetUploadContext;
import com.day.cq.dam.api.asset.AssetProcessingException;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Pattern;

@Component(service = AssetPreProcessor.class, immediate = true)
public class AssetValidationPreProcessor implements AssetPreProcessor {

    private static final Logger log = LoggerFactory.getLogger(AssetValidationPreProcessor.class);
    // 自定义文件名正则规则:仅允许字母、数字、下划线、短横线,带合法后缀
    private static final Pattern VALID_FILENAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_-]+\\.[a-zA-Z0-9]{2,4}$");
    // 允许的上传根路径
    private static final String ALLOWED_UPLOAD_ROOT = "/content/dam/authorized-assets";

    @Override
    public void process(AssetUploadContext context) throws AssetProcessingException {
        String fileName = context.getFileName();
        String targetParentPath = context.getParentPath();

        // 验证文件名规范
        if (!VALID_FILENAME_PATTERN.matcher(fileName).matches()) {
            String errorMsg = String.format("文件名不符合规范:%s,需匹配规则:%s", fileName, VALID_FILENAME_PATTERN.pattern());
            log.error(errorMsg);
            throw new AssetProcessingException(errorMsg);
        }

        // 验证上传路径
        if (!targetParentPath.startsWith(ALLOWED_UPLOAD_ROOT)) {
            String errorMsg = String.format("仅允许上传至%s路径下,当前目标路径:%s", ALLOWED_UPLOAD_ROOT, targetParentPath);
            log.error(errorMsg);
            throw new AssetProcessingException(errorMsg);
        }
    }
}

2. 扩展资产上传Servlet

如果需要更底层的请求拦截(比如处理特殊上传场景),可以扩展AEM默认的资产上传Servlet:

核心逻辑

  • 自定义OSGI Servlet,匹配资产上传的URL模式(如/content/dam/*/upload)
  • 在doPost方法中先提取请求中的文件名、目标路径参数
  • 执行验证规则,不通过则直接返回错误响应
  • 验证通过后,调用默认上传Servlet的逻辑完成上传

注意事项

  • 需确保Servlet的优先级高于默认上传Servlet,避免被覆盖
  • 需处理不同上传方式的参数差异(如批量上传、拖拽上传)

关键说明

  • 两种方案均会在Asset Compute启动前终止不合格资产的处理流程
  • AssetPreProcessor是官方推荐的标准扩展点,兼容性更好,实现更简洁
  • 验证逻辑需保证高效,避免阻塞上传请求
  • 抛出的异常信息会返回给客户端,可直接用于提示用户

内容的提问来源于stack exchange,提问作者SubSul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:27:41