Java MultipartFormDataInput请求的内容长度始终为-1
我使用RESTEasy按键和值放置一些数据。我只接受大小小于4k的数据,我想通过获取请求的内容长度进行检查。以下是我正在使用的方法:Java MultipartFormDataInput请求的内容长度始终为-1,java,rest,resteasy,multipartform-data,Java,Rest,Resteasy,Multipartform Data,我使用RESTEasy按键和值放置一些数据。我只接受大小小于4k的数据,我想通过获取请求的内容长度进行检查。以下是我正在使用的方法: @PUT @Path("/{key}") @Consumes(MediaType.MULTIPART_FORM_DATA) public Response addData( final @PathParam("key") String dataKey, MultipartFormDataInput data) throws IOException, Cla
@PUT
@Path("/{key}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response addData(
final @PathParam("key") String dataKey,
MultipartFormDataInput data) throws IOException, ClassNotFoundException {
final HttpServletRequest request = ....getHttpRequest(); //returns the request
final Map<String, List<InputPart>> parts = data.getFormDataMap();
final List<InputPart> inputParts = parts.get("data");
final InputPart part= inputParts.get(0);
final InputStream dataStream = part.getBody(InputStream.class, null);
int length = request.getContentLength();
String length2 = request.getHeader("Content-Length");
System.out.println(length);
System.out.println(length2);
service.addData(key, dataStream);
return Response.status(204).build();
}
@PUT
@路径(“/{key}”)
@使用(MediaType.MULTIPART\u FORM\u数据)
公共响应添加数据(
最终@PathParam(“键”)字符串数据键,
MultipartFormDataInput数据)引发IOException,ClassNotFoundException{
final HttpServletRequest request=..getHttpRequest();//返回请求
最终映射部分=data.getFormDataMap();
最终列表inputParts=parts.get(“数据”);
最终InputPart部分=inputParts.get(0);
最终InputStream数据流=part.getBody(InputStream.class,null);
int length=request.getContentLength();
stringlength2=request.getHeader(“内容长度”);
系统输出打印长度;
系统输出打印LN(长度2);
addData(key,dataStream);
返回Response.status(204.build();
}
但是,length
和length2
分别返回-1
和null
。如果我监视Fiddler并查看请求,我会注意到请求上的contentLength
不是-1
,而是一个正确的值
关于为什么我不能获取请求内容长度,有什么想法吗?谢谢
编辑:我的PUT请求使用高级Rest客户端Chrome扩展如下所示:
编辑:我不确定我还有什么要补充的,但对此有什么想法就好了。看看
@HeaderParam
是否适合你
无法重现您的问题。您是否可以尝试使用RESTeasy客户端进行测试:
WebTarget target=ClientBuilder.newClient().target(“您的URL”);MultipartFormDataOutput formData=新的MultipartFormDataOutput();addFormData(“数据”,“你好世界”,MediaType.TEXT\u PLAIN\u TYPE);实体=实体.实体(formData,MediaType.MULTIPART\u FORM\u DATA);响应=target.request().put(实体)有时间的话我会试试的。感谢您的回复。我无法使用RESTeasy客户端构建它。我觉得很奇怪,在Fiddler中我得到了一个内容长度,但在请求过程中我无法查看它。你说“无法使用RESTeasy客户端构建它”是什么意思?公共响应addData(@HeaderParam(“content length”)int length,final@PathParam(“key”)String dataKey,MultipartFormDataInput data)?谢谢你的建议,但结果正是我所怀疑的。我添加了这一行final@HeaderParam(“Content-Length”)字符串contentLength
,但结果是相同的:null
。我真的不明白在调试该方法时如何得到null
/-1
,但在Fiddler中查看时却正确。这可能与作为输入流的输入数据有关,并且不知道传入数据的长度,因此返回null/-1吗?我只是大声说出来。你们需要整个有效负载的长度,或者特定数据元素的长度