Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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 如何使用Jersey计算多部分请求正文的MD5哈希_Java_Jersey_Md5_Multipartform Data - Fatal编程技术网

Java 如何使用Jersey计算多部分请求正文的MD5哈希

Java 如何使用Jersey计算多部分请求正文的MD5哈希,java,jersey,md5,multipartform-data,Java,Jersey,Md5,Multipartform Data,我正在使用Jersey,我需要计算多部分post请求主体的MD5哈希。我当前的资源方法签名如下所示: @POST @Consumes("multipart/form-data") @Produces("application/json") public String post( @FormDataParam("name") String name, @FormDataParam("description") String description,

我正在使用Jersey,我需要计算多部分post请求主体的MD5哈希。我当前的资源方法签名如下所示:

@POST
@Consumes("multipart/form-data")
@Produces("application/json")
public String post(
        @FormDataParam("name") String name,
        @FormDataParam("description") String description,
        @FormDataParam("iconfile") FormDataBodyPart part,
        @Context HttpServletRequest hsr) {
    // ...
} 
我没有找到获取原始请求体的方法,即我需要计算MD5散列。调用我的资源方法时,来自
HttpServletRequest
hsr.getInputStream()
)的输入流已被消耗,我无法再次读取它

我尝试将我的方法签名更改为以下内容:

@POST
@Consumes("multipart/form-data")
@Produces("application/json")
public String test(byte[] bytes) {
    // ...
}
通过这种方式,我获得了请求正文的原始字节,并且我可以成功地计算MD5哈希,但是我不知道如何从那里处理多部分请求(分割部分,获取每个部分,等等)。我必须自己处理原始请求吗?或者我可以让Jersey来做这个肮脏的工作,为我提取
FormDataParam
s,让我以某种方式计算MD5哈希吗


谢谢,

这就是我最后要做的:

我创建了一个容器请求过滤器,它使用实体输入流,计算MD5校验和,并再次设置实体输入流,以便Jersey可以使用它来处理多部分请求,并为我提取
FormDataParam
s

我还将
HttpServletRequest
注入我的过滤器和我的资源方法中,以在两者之间通信数据

这是过滤器类:

public class MD5CheckFilter implements ContainerRequestFilter {

    @Context HttpServletRequest hsr;

    public ContainerRequest filter(ContainerRequest request) {

        byte[] bytes = request.getEntity(byte[].class); // this consumes the entity input stream
        String contentMD5 = calculateMD5(bytes);
        hsr.setAttribute("contentMD5", contentMD5);

        // set the entity input stream so it can be consumed again
        request.setEntityInputStream(new ByteArrayInputStream(bytes));

        return request;
    }

}
这是
servlet
部分中我的
web.xml
的相关部分:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>path.to.MD5CheckFilter</param-value>
</init-param>

jersey不是已经通过提供字节数组完成了肮脏的工作了吗?为什么要在这之后处理这些部分?请检查以下链接:如果要使用字节数组而不是上面链接中的方法,请将字节数组作为名称和说明之外的另一个参数发送。不要使用单个参数来表示整个请求。@a.J.那么如何计算整个请求的MD5哈希值呢?(不仅仅是表示文件的部分;我的请求还有其他与文件不同的部分)一个可能的选择是在方法中添加以下“@Context-HttpServletRequest-request”作为参数,然后您可以使用“request”来获取部分或任何其他内容。
@POST
@Consumes("multipart/form-data")
@Produces("application/json")
public String post(
        @FormDataParam("name") String name,
        @FormDataParam("description") String description,
        @FormDataParam("iconfile") FormDataBodyPart part,
        @Context HttpServletRequest hsr) {
    // ...
}