2017-05-15 93 views
0

我想從本地文件系統讀取二進制文件,通過HTTP發送,然後在不同的應用程序中,我需要接收文件並將其寫入本地文件系統,全部使用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}"); 

正如你所看到的,我使用的是駱駝HTTP4組件發送文件和Spark-Rest組件來接收它。

當我運行這個,並將文件放入本地目錄時,客戶端和服務器應用程序都工作,並且文件被傳輸,接收並再次寫出。我看到的問題是原始文件是5860kb,但收到的文件是9932kb。因爲它是一個二進制文件,所以它不可讀,但是當我在文本編輯器中打開它時,我可以很容易地看到它已更改,許多字符也不同。

感覺就像它被當作一個文本文件一樣,它正在被接收並寫入一個不同的字符集來寫入它。作爲一個二進制文件,我不希望它被視爲一個文本文件,這就是爲什麼我把它作爲application/octet-stream處理,但這似乎並沒有兌現。或者,也許這不是一個字符集問題,可能是其他的東西?純文本文件被正確地發送和接收,沒有損壞,這導致我認爲它是二進制文件中引起問題的特殊字符。

我想解決這個問題,以便收到的文件是相同的發送文件,所以任何幫助,將不勝感激。

回答

0

我得到了同樣的問題。默認情況下,Camel會在生成http結點時將其序列化爲字符串。

你應該明確地轉換GenericFile做一個簡單的byte []( 「:.. http4」)

+0

感謝您的喬納森。要前.convertBodyTo(字節[]類)。在我得到你的答案之前,我設法通過將接收組件從spark-rest更改爲一個servlet來實現它,這讓我認爲spark-rest是個問題。不過,我會嘗試你的解決方案,並讓你知道我如何繼續。 – 4ppledore

+0

好的@Jonathan,我試過了你的建議,恐怕它不適合我。正如我所說的,我已經通過將消費者更改爲'servlet'而不是'spark-rest'來解決問題,這表明問題出現在spark-rest中,即在接收端。我猜spark-rest中有一個默認設置,它導致它將任何消息轉換爲可以重寫的字符串,但是我一直無法找到該設置,而我只是要使用servlet的。 – 4ppledore