基于Spring Integration Files实现文件迁移时的自定义重命名
看起来你已经搭好了Spring Integration文件迁移的基础框架,要加上自定义重命名功能其实很简单——咱们可以通过FileNameGenerator接口来实现,不管是加固定字符串前缀/后缀、时间戳,还是组合式命名都能轻松搞定。
下面是补全并添加了自定义重命名逻辑的完整代码:
import org.springframework.integration.file.FileHeaders; import org.springframework.integration.file.FileWritingMessageHandler; import org.springframework.integration.file.support.FileExistsMode; import org.springframework.messaging.Message; import java.io.File; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @Bean @ServiceActivator(inputChannel = FILE_CHANNEL_SOURCE) public MessageHandler moveFiles() { FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(processingDir)); handler.setFileExistsMode(FileExistsMode.FAIL); handler.setDeleteSourceFiles(true); handler.setExpectReply(false); // 自定义文件名生成器:实现「固定前缀+时间戳+原文件名」的组合命名 handler.setFileNameGenerator(this::generateCustomFileName); return handler; } // 抽离命名逻辑,让代码更清晰 private String generateCustomFileName(Message<?> message) { // 获取原文件名(从Message Header中提取) String originalFileName = (String) message.getHeaders().get(FileHeaders.FILENAME); if (originalFileName == null) { originalFileName = "unknown_file"; // 处理原文件名为空的边界情况 } // 生成格式化时间戳(精确到秒,可根据需求调整格式) String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); // 自定义前缀 String customPrefix = "migrated_"; // 组合新文件名 return customPrefix + timestamp + "_" + originalFileName; }
几种常见的重命名场景示例
如果你需要其他命名规则,直接修改generateCustomFileName方法或者替换Lambda逻辑即可:
- 仅添加固定前缀/后缀
handler.setFileNameGenerator(message -> { String originalFileName = (String) message.getHeaders().get(FileHeaders.FILENAME); return "processed_" + originalFileName; // 加前缀 // 或者 return originalFileName + "_archived"; // 加后缀 });
- 用时间戳作为文件名(保留原后缀)
如果不需要保留原文件名,只想用时间戳命名,记得保留文件后缀:
import org.apache.commons.io.FilenameUtils; handler.setFileNameGenerator(message -> { String originalFileName = (String) message.getHeaders().get(FileHeaders.FILENAME); String fileExt = FilenameUtils.getExtension(originalFileName); // 获取原文件后缀 String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); // 精确到毫秒 return timestamp + "." + fileExt; });
- 基于自定义Header信息命名
如果需要根据业务标识(比如批次ID)来命名,可以从Message Header中提取自定义字段:
handler.setFileNameGenerator(message -> { String originalFileName = (String) message.getHeaders().get(FileHeaders.FILENAME); String batchId = (String) message.getHeaders().get("batch_id"); // 自定义业务Header return batchId + "_" + originalFileName; });
小提示
- 记得处理原文件名为空的情况,避免空指针异常;
- 如果要保证文件名绝对唯一,可以在时间戳后加上
UUID.randomUUID(); FileExistsMode可以根据需求调整:如果允许覆盖同名文件,改成FileExistsMode.REPLACE即可。
内容的提问来源于stack exchange,提问作者Fatmajk
相关产品推荐
相关产品推荐

