Apache camel 使用Apache Camel在http上损坏二进制文件

Apache camel 使用Apache Camel在http上损坏二进制文件,apache-camel,Apache Camel,我试图从本地文件系统读取一个二进制文件,通过HTTP发送,然后在另一个应用程序中,我需要接收该文件并将其写入本地文件系统,所有这些都使用Apache Camel 我的(简化的)客户端代码如下所示: from("file:<path_to_local_directory>") .setHeader(Exchange.HTTP_PATH, header("CamelFileNameOnly")) .setHeader(Exc

我试图从本地文件系统读取一个二进制文件,通过HTTP发送,然后在另一个应用程序中,我需要接收该文件并将其写入本地文件系统,所有这些都使用Apache Camel

我的(简化的)客户端代码如下所示:

        from("file:<path_to_local_directory>")
            .setHeader(Exchange.HTTP_PATH, header("CamelFileNameOnly"))
            .setHeader(Exchange.CONTENT_TYPE, constant("application/octet-stream"))
            .to("http4:localhost:9095");
from(“文件:”)
.setHeader(Exchange.HTTP_路径,头(“CamelFileNameOnly”))
.setHeader(Exchange.CONTENT_类型,常量(“应用程序/八位字节流”))
.to(“http4:localhost:9095”);
我的服务器代码是:

    restConfiguration()
            .component("spark-rest")
            .port(9095);

    rest("/{fileName}")
            .post()
            .consumes("application/octet-stream")
            .to("file:<path_to_output_dir>?fileName=${header.fileName}");
restConfiguration()
.部件(“火花座”)
.港口(9095);
rest(“/{fileName}”)
.post()
.消耗(“应用程序/八位字节流”)
.to(“文件:?文件名=${header.fileName}”);
如您所见,我使用Camel HTTP4组件发送文件,使用Spark Rest组件接收文件

当我运行这个程序并将一个文件放入本地目录时,客户端和服务器应用程序都会工作,并且文件会被再次传输、接收和写入。我看到的问题是原始文件是5860kb,但接收到的文件是9932kb。因为它是一个二进制文件,所以它不是真正可读的,但是当我在文本编辑器中打开它时,我可以很容易地看到它已经改变了,并且许多字符是不同的

它感觉就像是一个文本文件,它被接收并以不同的字符集写入。作为一个二进制文件,我不希望它被视为一个文本文件,这就是为什么我将它作为
应用程序/octet流处理的原因,但这似乎并不值得尊重。或者这不是一个字符集问题,可能是其他问题?纯文本文件的传输和接收是正确的,没有损坏,这使我认为是二进制文件中的特殊字符造成了问题


我想解决这个问题,以便收到的文件与发送的文件完全相同,因此我们将非常感谢您的帮助。

我也遇到了同样的问题。默认情况下,Camel将在生成http endoint时将其序列化为字符串


您应该在.to(“http4:…”)之前执行一个简单的:.convertBodyTo(byte[].class),将GenericFile显式转换为byte[]。默认情况下,Camel将在生成http endoint时将其序列化为字符串


您应该在.to(“http4:…”)之前执行一个简单的:.convertBodyTo(byte[].class),将GenericFile显式转换为byte[]。在我得到您的答案之前,我通过将接收组件从spark rest更改为servlet使其工作,这使我认为spark rest是问题所在。不过,我会试试你的解决方案,让你知道我的进展如何。好吧@Jonathan,我试过你的建议,但恐怕对我不起作用。正如我提到的,我通过将使用者更改为
servlet
,而不是
spark rest
,这表明问题出在spark rest中,即在接收端。我猜spark rest中有一个默认设置,它会将任何消息转换为字符串,我可以覆盖它,但我还没有找到该设置,我将使用servlet运行。谢谢Jonathan。在我得到您的答案之前,我通过将接收组件从spark rest更改为servlet使其工作,这使我认为spark rest是问题所在。不过,我会试试你的解决方案,让你知道我的进展如何。好吧@Jonathan,我试过你的建议,但恐怕对我不起作用。正如我提到的,我通过将使用者更改为
servlet
,而不是
spark rest
,这表明问题出在spark rest中,即在接收端。我猜spark rest中有一个默认设置,它可以将任何消息转换为字符串,我可以覆盖它,但我还没有找到该设置,我将使用servlet运行它。