使用resteasy和multipart/form-data请求的最大文件大小

3

当使用resteasy处理multipart/form-data请求时,我该如何控制最大文件大小和/或最大请求大小?

我的代码看起来像这样:

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

通过使用@MultipartConfig注解,我可以使用Servlet来控制一些东西。

因此,我考虑绕过resteasy,并使用@Context注入HttpServletRequest,并在web.xml中配置我的Servlet,但我不确定会有什么副作用。

2个回答

4
使用JAX-RS 2.0,您可以使用@NameBinding注解将ContainerRequestFilter绑定到您的上传方法。在此过滤器中,您将查看content-length请求头,并且如果内容长度超过您计划接受的最大值,则丢弃该请求(requestContext.abortWith(...))。
使用JAX-RS 1.1和RESTEasy,您可能可以使用PreProcessInterceptor (http://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/Interceptors.html#PreProcessInterceptors)执行同样的操作,并遵循类似于上述描述的逻辑。

经过几天的搜索,我猜这是正确的方法!我一直在寻找更多“内置”的解决方案,但我找不到任何东西。谢谢! - thomas.g
Content-Length 不是获取文件大小的正确方式,从技术上讲,头部是可选的,请参见此处类似请求的响应 https://dev59.com/MJHea4cB1Zd3GeqPvOPN#34811675 - Réda

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接