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

Apache Camel CXFRS下载二进制附件异常:文件损坏问题求助

问题解决思路

核心问题分析

  • REST接口定义的@Produces({"application/json"})与实际返回的二进制文件类型不匹配,导致CXFRS处理响应时可能执行了不必要的序列化操作,破坏二进制内容结构。
  • Processor中Response.ok("")传入空字符串,未将实际二进制文件内容注入响应体,这是文件损坏的直接原因。
  • marshal().mimeMultipart()对单一二进制响应做了多余的多部分封装,干扰了内容的正确传输。

修正步骤

1. 调整REST接口的Produces注解

将接口的Produces改为支持二进制的类型,可保留JSON兼容或直接指定二进制类型:

@javax.ws.rs.Path("/getworkorderattachment/{workLogID}")
@javax.ws.rs.GET()
@javax.ws.rs.Produces({"application/octet-stream", "application/json"})
Object getWorkOrderWorkLogIDAttachment();

2. 修正Processor的响应构建逻辑

将实际二进制内容(字节数组或InputStream)传入Response.ok(),替代空字符串。假设已获取到二进制内容:

// 示例:使用字节数组传入二进制内容
byte[] fileBytes = ...; // 从上游HTTP响应中读取的完整附件字节

Response.ResponseBuilder jaxrsResponseBuilder = Response.ok(fileBytes)
    .header("Content-Disposition", contentDisposition)
    .type(MediaType.APPLICATION_OCTET_STREAM);                

Response response = jaxrsResponseBuilder.build();
exchange.getIn().setBody(response);

若使用InputStream:

InputStream fileInputStream = ...;
Response.ResponseBuilder jaxrsResponseBuilder = Response.ok(fileInputStream)
    .header("Content-Disposition", contentDisposition)
    .type(MediaType.APPLICATION_OCTET_STREAM);                
exchange.getIn().setBody(jaxrsResponseBuilder.build());

3. 移除不必要的mimeMultipart序列化

返回单一二进制文件时,无需多部分封装,直接移除该步骤:

// 删除此行:.marshal().mimeMultipart()

验证要点

  • 确认上游HTTP调用获取的二进制内容完整,未被错误编码(例如当成UTF-8字符串读取导致字节丢失)。
  • 检查Content-Disposition头格式是否合规,示例:attachment; filename="your-file.ext"。

内容的提问来源于stack exchange,提问作者Snehangshu Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:20:29