使用camel-http下载文件:拆分URL列表生成File对象求助
解决方案:用Apache Camel Splitter EIP拆分URL列表并下载为File对象
我来帮你梳理下在Apache Camel里实现这个需求的具体步骤,核心就是把Splitter拆分、HTTP下载和文件封装这几个环节串起来,下面是完整的实现方案:
1. 核心逻辑梳理
- 用
SplitterEIP拆分传入的ArrayList<String>(URL列表),得到单个URL字符串 - 对每个URL,通过Camel的
HTTP组件发起GET请求获取文件内容 - 将下载的字节内容写入本地文件,封装成
File对象传递到后续路由节点
2. 完整路由代码示例(Java DSL)
import org.apache.camel.builder.RouteBuilder; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; public class UrlFileDownloadRoute extends RouteBuilder { @Override public void configure() throws Exception { // 路由入口:接收包含URL列表的ArrayList<String> from("direct:startUrlDownload") // 拆分URL列表,开启流式处理优化大列表内存占用 .split(body()).streaming() // 设置HTTP请求的目标URL头 .process(exchange -> { String targetUrl = exchange.getIn().getBody(String.class); exchange.getIn().setHeader("CamelHttpUri", targetUrl); }) // 发起HTTP GET请求下载文件内容 .to("http://placeholder?httpMethod=GET") // 将下载的字节内容转为File对象 .process(exchange -> { byte[] fileBytes = exchange.getIn().getBody(byte[].class); String url = exchange.getIn().getHeader("CamelHttpUri", String.class); // 可选:从URL提取自定义文件名,比如从https://xxx/abc.pdf提取abc.pdf String fileName = url.substring(url.lastIndexOf('/') + 1); // 指定保存路径,这里用项目根目录下的downloads文件夹 Path savePath = Path.of("downloads", fileName); // 确保目录存在 Files.createDirectories(savePath.getParent()); // 写入文件并转为File对象 Files.write(savePath, fileBytes); File downloadedFile = savePath.toFile(); exchange.getIn().setBody(downloadedFile); }) // 这里可以添加后续处理,比如文件校验、入库通知等 .log("已完成下载:URL=${header.CamelHttpUri},文件=${body.getAbsolutePath()}") .end(); // 结束Splitter拆分逻辑 } }
3. 关键细节说明
- Splitter流式处理:如果你的URL列表非常大,一定要加上
.streaming(),它会逐个处理列表元素,避免一次性加载所有URL到内存。 - HTTP组件配置:示例里的
http://placeholder是占位符,Camel会通过CamelHttpUri头自动替换成目标URL,不需要硬编码。 - 文件路径自定义:你可以根据业务需求修改保存路径,比如用临时目录(
Files.createTempFile)或者固定业务目录,文件名也可以结合时间戳避免重复。 - 资源清理:如果不需要保留下载的文件,可在后续步骤中调用
file.delete(),或者用Camel的file组件配合delete=true属性自动清理临时文件。
4. 调用示例
你可以通过ProducerTemplate触发这个路由,传入URL列表:
import org.apache.camel.ProducerTemplate; import org.apache.camel.spring.SpringCamelContext; import java.util.ArrayList; import java.util.List; public class MainApp { public static void main(String[] args) throws Exception { SpringCamelContext context = new SpringCamelContext(); context.addRoutes(new UrlFileDownloadRoute()); context.start(); ProducerTemplate template = context.createProducerTemplate(); List<String> urlList = new ArrayList<>(); urlList.add("https://example.com/file1.pdf"); urlList.add("https://example.com/file2.jpg"); template.sendBody("direct:startUrlDownload", urlList); context.stop(); } }
内容的提问来源于stack exchange,提问作者Parth Mody
相关产品推荐
相关产品推荐

