使用Apache Camel通过http进行二进制文件损坏

时间:2017-05-15 10:06:24

标签: apache-camel

我正在尝试从本地文件系统读取二进制文件,通过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");

我的服务器代码是:

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

    rest("/{fileName}")
            .post()
            .consumes("application/octet-stream")
            .to("file:<path_to_output_dir>?fileName=${header.fileName}");

如您所见,我正在使用Camel HTTP4组件发送文件和Spark-Rest组件来接收它。

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

感觉它被视为一个文本文件,并且它被接收和写入与其编写的字符集不同的字符集。作为一个二进制文件,我不希望它被视为文本文件,这就是我将其作为application/octet-stream处理的原因,但这似乎并不值得尊敬。或者它可能不是字符集问题,可能是其他的东西?纯文本文件正确传输和接收,没有损坏,这使我认为它是二进制文件中导致问题的特殊字符。

我想解决这个问题,以便收到的文件与发送的文件完全相同,所以我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。默认情况下,Camel会在生成http端点时将其序列化为String。

你应该通过在.to之前做一个简单的:.convertBodyTo(byte [] .class)将GenericFile显式转换为byte [](&#34; http4:..&#34;)