Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Spring处理的POST请求中获取原始二进制数据?_Java_Spring_Curl_Binary Data - Fatal编程技术网

Java 如何从Spring处理的POST请求中获取原始二进制数据?

Java 如何从Spring处理的POST请求中获取原始二进制数据?,java,spring,curl,binary-data,Java,Spring,Curl,Binary Data,我需要编写一个能够处理CUrl发送的二进制数据的应用程序,例如: curl localhost:8080/data --data-binary @ZYSF15A46K1.txt 我创建了一个后处理方法,如下所示: @RequestMapping(method = RequestMethod.POST, value = "/data") public void acceptData(HttpEntity<byte[]> requestEntity) throws Except

我需要编写一个能够处理CUrl发送的二进制数据的应用程序,例如:

curl localhost:8080/data --data-binary @ZYSF15A46K1.txt
我创建了一个后处理方法,如下所示:

@RequestMapping(method = RequestMethod.POST, value = "/data")
    public void acceptData(HttpEntity<byte[]> requestEntity) throws Exception {
        process(requestEntity.getBody());
    }
@RequestMapping(method=RequestMethod.POST,value=“/data”)
public void acceptData(HttpEntity requestEntity)引发异常{
进程(requestEntity.getBody());
}
然而,它似乎并没有返回原始的二进制数据。我曾经尝试发送一个GZip文件,在经历了Spring之后,它现在不再是可解压缩的了,这让我相信我要么得到了太多的数据,要么得到了太少的数据


如何解决此问题并获取原始二进制数据?

我可以使用以下代码解决此问题:

@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);
}

Spring默认情况下进行预处理,这会导致
HttpServletRequest
在到达
RequestMapping
时变为空。添加
FilterRegistrationBean
Bean解决了这个问题。

这就像在控制器方法的参数中声明InputStream一样简单:

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

您不需要禁用HiddenHttpMethodFilter,如果禁用,可能是因为您的请求在某种程度上是错误的。请参阅。

尝试使用
HttpServletDequest
作为控制器的输入参数,并从其
InputStream
读取原始数据@geminieth也尝试过,出于某种原因,它总是返回空对象。您是否设置过字符编码?您可以检查
内容长度
,以确保获得正确的请求。如果
Content Length
有效,您可以从
InputStream
中读取特定长度的内容。如果没有,请检查您的请求。@Gemineith谢谢!我仔细研究了HttpServletRequest,问题就解决了(见我的答案)。是的,我已经忘记了。输入流默认值只能读取一次。我的直觉是,funky HiddenHttpMethodFilter disable将关闭自动多部分过滤:“某种程度上是错误的”=检查请求中是否设置了
内容类型
标题,并且它不是
多部分/表单数据
应用程序/x-www-form-url-encoded
我应该使用什么注释从邮递员到spring boot获取二进制数据?这取决于邮递员如何发送它。看这个。如果发送“原始”数据,则可以按原样使用上述声明。