【问题标题】:Max file size with resteasy and multipart/form-data requestresteasy 和 multipart/form-data 请求的最大文件大小
【发布时间】:2014-01-18 15:12:26
【问题描述】:

使用 resteasy 处理多部分/表单数据请求时,如何控制最大文件大小和/或最大请求大小?

我的代码如下所示:

@POST
@Path("/somerestresource")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response handleForm(@MultipartForm MyForm form) {
    ...
}

使用 Servlet,我可以使用 @MultipartConfig 注释来控制内容。

所以我正在考虑绕过resteasy并使用@Context注入HttpServletRequest并在web.xml中配置我的servlet,但我不确定副作用。

【问题讨论】:

    标签: java jakarta-ee jax-rs resteasy multipartform-data


    【解决方案1】:

    在 JAX-RS 2.0 中,您可以使用 ContainerRequestFilter 通过 @NameBinding 注释绑定到您的上传方法。在此过滤器中,您将查看 content-length 请求标头,如果内容长度超过您计划接受的最大值 (requestContext.abortWith(...)),则丢弃该请求

    使用 JAX-RS 1.1 和 RESTEasy,您可能可以使用 PreProcessInterceptor (http://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/Interceptors.html#PreProcessInterceptors) 执行相同的操作,并遵循与上述类似的逻辑逻辑。

    【讨论】:

    • 经过几天的搜索,我想这是要走的路!我一直在寻找更多“内置”解决方案,但我找不到任何东西。谢谢!
    • Content-Length 不是获取文件大小的正确方法,从技术上讲,标题是可选的,请在此处查看类似请求的响应stackoverflow.com/a/34811675/2517413
    【解决方案2】:

    除了 Xavier 的回答,您还可以从注入的@Context HttpServletRequest 中获取content-length 标头。此外,这还不够,因为标头可能不可用(例如,当分块用于 POST 正文时)。然后你有两个选择:让调用失败,因为你不知道流的长度,或者诉诸使用,例如,BoundedInputStream 来读取请求的上传部分的正文。

    次要细节:content-length 标头通常与主请求一起发送,而不是与多部分数据的每个部分一起发送。因此,它不能准确地表示上传的大小。

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多