2016-04-27 1474 views
2

我需要寫這將能夠處理由捲曲發送的二進制數據,如應用程序:如何從Spring處理的POST請求中獲取原始二進制數據?

curl localhost:8080/data --data-binary @ZYSF15A46K1.txt 

我創建一個POST處理方法如下:

@RequestMapping(method = RequestMethod.POST, value = "/data") 
    public void acceptData(HttpEntity<byte[]> requestEntity) throws Exception { 
     process(requestEntity.getBody()); 
    } 

然而,它似乎沒有返回原始的二進制數據。我試過發送一個GZip文件,經過Spring之後它現在可以解壓縮了,這讓我相信我要麼獲得太多的數據,要麼數據太少。

如何解決此問題並獲取原始二進制數據?

+0

嘗試使用'HttpServletDequest'作爲控制器的輸入參數,並從其InputStream中讀取原始數據。 –

+0

@GeminiKeith也嘗試過,因爲某些原因,它總是返回一個空對象。 –

+0

你有沒有設置字符編碼?您可以檢查「Content-Length」以確保您獲得正確的請求。如果'Content-Length'有效,你可以從'InputStream'中以特定的長度讀取它。如果不是,請檢查您的請求。 –

回答

2

這就像在你的控制器方法的參數聲明的InputStream一樣容易:

@RequestMapping(method = RequestMethod.POST, value = "/data") 
public void acceptData(InputStream dataStream) throws Exception { 
    processText(dataStream); 
} 

你不應該需要禁用HiddenHttpMethodFilter,如果你這樣做可能是您的要求是錯誤的以某種方式。請參閱https://github.com/spring-projects/spring-boot/issues/5676

5

我能解決這個使用下面的代碼:

@Bean 
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter); 
    registration.setEnabled(false); 
    return registration; 
} 

@RequestMapping(method = RequestMethod.POST, value = "/data") 
public void acceptData(HttpServletRequest requestEntity) throws Exception { 
    byte[] processedText = IOUtils.toByteArray(requestEntity.getInputStream()); 
    processText(processedText); 
} 

春天做預處理默認情況下,這將導致HttpServletRequest在到達RequestMapping的時候是空的。添加FilterRegistrationBean Bean解決了這個問題。

+0

是的,我忘記了。輸入流默認只能讀取一次。 –

相關問題