下载时如何从HTTP获取文件名?使用Camel处理HTTP GET请求获取文件名咨询
Hey,我来分享下这两个场景下的实用解决方案,都是我在实际项目里踩过坑后总结出来的思路:
一、下载文件时从HTTP中获取文件名
通常有两种可靠的途径,优先级建议按下面的顺序来:
优先解析响应头的
Content-Disposition
正规的文件下载接口会在响应头里返回Content-Disposition字段,格式一般是:Content-Disposition: attachment; filename="example.pdf"
你可以通过解析这个字段来提取文件名。比如用Java代码实现的话:
String disposition = exchange.getIn().getHeader("Content-Disposition", String.class); String fileName = null; if (disposition != null && disposition.contains("filename=")) { int startIndex = disposition.indexOf("filename=") + 9; int endIndex = disposition.indexOf(";", startIndex); if (endIndex == -1) { endIndex = disposition.length(); } fileName = disposition.substring(startIndex, endIndex).replace("\"", ""); }从请求URL的路径中提取
如果响应头没有提供文件名,那可以从请求URL的最后一段路径来获取。比如URL是https://your-domain.com/files/report_2024.pdf,直接截取最后一个/后的字符串即可:String url = exchange.getIn().getHeader("CamelHttpUrl", String.class); String fileName = url.substring(url.lastIndexOf("/") + 1);
二、Apache Camel处理HTTP GET请求时动态生成文件名(请求头无有效信息)
当请求头里没有任何可用来生成文件名的信息时,我们可以结合Camel的特性动态生成唯一且有辨识度的文件名,给你几个常用的方案:
用UUID生成完全唯一的文件名
UUID能保证文件名不会重复,适合不需要可读性只要求唯一性的场景。路由示例:import java.util.UUID; import org.apache.camel.builder.RouteBuilder; public class FileDownloadRoute extends RouteBuilder { @Override public void configure() throws Exception { from("jetty:http://0.0.0.0:8080/api/download") // 生成UUID作为文件名,加上你需要的后缀 .process(exchange -> { String uniqueFileName = UUID.randomUUID().toString() + ".csv"; exchange.getIn().setHeader("CamelFileName", uniqueFileName); }) .to("file:/opt/downloads"); } }结合时间戳+随机数生成可读的唯一文件名
如果需要文件名带有时间信息,方便后续排查,可以用Camel的Simple表达式来生成,不用写处理器:from("jetty:http://0.0.0.0:8080/api/download") // 格式:年月日时分秒毫秒-四位随机数.后缀 .setHeader("CamelFileName", simple("${date:now:yyyyMMddHHmmssSSS}-${random(1000,9999)}.xlsx")) .to("file:/opt/downloads");结合请求参数生成个性化文件名
如果请求里有业务标识参数(比如userId),可以把它拼接进去,让文件名更有业务意义:from("jetty:http://0.0.0.0:8080/api/download?userId=123") .process(exchange -> { String userId = exchange.getIn().getHeader("userId", String.class); String fileName = String.format("user_report_%s_%s.pdf", userId, UUID.randomUUID().toString().substring(0,8)); exchange.getIn().setHeader("CamelFileName", fileName); }) .to("file:/opt/downloads");
内容的提问来源于stack exchange,提问作者Mikael Andersson Wigander
相关产品推荐
相关产品推荐

