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
相关产品推荐
相关产品推荐

