package jnpf.aop; import jnpf.config.ConfigValueUtil; import jnpf.constant.MsgCode; import jnpf.exception.DataException; import jnpf.util.PdfUtil; import jnpf.util.XSSEscape; import lombok.extern.slf4j.Slf4j; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.UploadPretreatment; import org.dromara.x.file.storage.core.aspect.*; import org.dromara.x.file.storage.core.platform.FileStorage; import org.dromara.x.file.storage.core.recorder.FileRecorder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.IOException; import java.io.InputStream; import java.util.function.Consumer; @Slf4j @Component public class MyFileAspect implements FileStorageAspect { @Autowired private ConfigValueUtil configValueUtil; @Override public FileInfo uploadAround(UploadAspectChain chain, FileInfo fileInfo, UploadPretreatment pre, FileStorage fileStorage, FileRecorder fileRecorder) { checkFilePath(fileInfo); if(configValueUtil.isCheckFilePdf()) { try { String ext = fileInfo.getExt(); if("pdf".equalsIgnoreCase(ext)) { log.error("检测PDF文件"); if (PdfUtil.containsJavaScript(pre.getFileWrapper().getInputStream())) { throw new DataException(MsgCode.FA053.get()); } } } catch (IOException e) { log.error("PDF文档解析失败: {}", e.getMessage()); } } return FileStorageAspect.super.uploadAround(chain, fileInfo, pre, fileStorage, fileRecorder); } @Override public boolean deleteAround(DeleteAspectChain chain, FileInfo fileInfo, FileStorage fileStorage, FileRecorder fileRecorder) { checkFilePath(fileInfo); return FileStorageAspect.super.deleteAround(chain, fileInfo, fileStorage, fileRecorder); } @Override public boolean existsAround(ExistsAspectChain chain, FileInfo fileInfo, FileStorage fileStorage) { checkFilePath(fileInfo); return FileStorageAspect.super.existsAround(chain, fileInfo, fileStorage); } @Override public void downloadAround(DownloadAspectChain chain, FileInfo fileInfo, FileStorage fileStorage, Consumer consumer) { checkFilePath(fileInfo); FileStorageAspect.super.downloadAround(chain, fileInfo, fileStorage, consumer); } @Override public void downloadThAround(DownloadThAspectChain chain, FileInfo fileInfo, FileStorage fileStorage, Consumer consumer) { checkFilePath(fileInfo); FileStorageAspect.super.downloadThAround(chain, fileInfo, fileStorage, consumer); } private void checkFilePath(FileInfo fileInfo){ //处理特殊文件名 fileInfo.setPath(XSSEscape.escapePath(fileInfo.getPath())); fileInfo.setFilename(XSSEscape.escapePath(fileInfo.getFilename())); } }