【问题标题】:Content length for MultipartFormDataInput request always -1MultipartFormDataInput 请求的内容长度始终为 -1
【发布时间】:2014-09-04 21:01:19
【问题描述】:

我正在使用 RESTEasy 通过键和值来放置一些数据。我只想接受大小小于 4k 的数据,我想我会通过获取请求的内容长度来检查。这是我正在使用的方法:

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

但是,lengthlength2 分别返回 -1null。如果我监视 Fiddler 并查看请求,我注意到请求中的 contentLength 不是 -1,而是一个正确的值。

关于为什么我无法获得请求内容长度的任何想法?谢谢。

编辑:我的 PUT 请求使用 Advanced Rest Client Chrome 扩展程序如下所示:http://i.imgur.com/aI6WNDy.png

编辑:不确定我还有什么要补充的,但对此有任何想法都会很棒。

【问题讨论】:

  • 无法重现您的问题。能否尝试使用 RESTeasy 客户端进行测试:WebTarget target = ClientBuilder.newClient().target("yourUrl"); MultipartFormDataOutput formData = new MultipartFormDataOutput(); formData.addFormData("data", "Hello World", MediaType.TEXT_PLAIN_TYPE); Entity&lt;MultipartFormDataOutput&gt; entity = Entity.entity(formData, MediaType.MULTIPART_FORM_DATA); Response response = target.request().put(entity);
  • 有时间我会试一试。感谢您的回复。
  • 我无法使用 RESTeasy 客户端构建它。我觉得奇怪的是,在 Fiddler 中我得到了一个内容长度,但在请求期间我无法查看它。
  • “无法使用 RESTeasy 客户端构建”是什么意思?
  • public Response addData(@HeaderParam("Content-Length") int length, final @PathParam("key") String dataKey, MultipartFormDataInput data) ?

标签: java rest resteasy multipartform-data


【解决方案1】:

【讨论】:

  • 感谢您的建议,但结果是我所怀疑的。我添加了这一行final @HeaderParam("Content-Length") String contentLength,但结果是一样的:null。我真的不明白如何在调试方法时获得null/-1,但在 Fiddler 中查看时正确。它可能与输入数据是输入流并且不知道传入数据的长度因此返回null / -1有关吗?我只是在这里大声说话。
  • 您需要整个有效负载的长度,或特定数据元素的长度
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多