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

使用camel-http下载文件:拆分URL列表生成File对象求助

解决方案:用Apache Camel Splitter EIP拆分URL列表并下载为File对象

我来帮你梳理下在Apache Camel里实现这个需求的具体步骤,核心就是把Splitter拆分、HTTP下载和文件封装这几个环节串起来,下面是完整的实现方案:

1. 核心逻辑梳理

  • 用Splitter EIP拆分传入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:06:06