java - 在 Jersey 中使用@Context HttpServletRequest 和@FormDataParam 进行多文件上传

标签 java spring-mvc jersey jax-rs

我创建了一个 jersey restful web 服务,我使用 @Context HttpServletRequest 请求 作为方法签名设法上传多个文件工作得很好。
事情是,要获取其他表单字段,我需要重复检查 .isFormField(); 方法和相对 .getName(); 文件或 .getFieldName( );.getString(); 方法来检查必填字段是否存在每次调用 web 服务,我认为这很冗长如果还有其他几个字段,则过程昂贵。

更简单的方法是使用 @FormDataParam,其中 web 服务过去常常使用客户端需要传递的参数公开,但问题是我无法上传多个文件一去。

因为如果媒体类型或编码类型为 multipart/form-data,也无法使用 request.getParameter("field1"); 获取其他表单字段。

每当我尝试将 @FormDataParam@Context HttpServletRequest 请求 组合在一起时,它会抛出异常:
org.apache.tomcat.util.http.fileupload.FileUploadException:流关闭
在使用 .parseRequest(request); ServletFileUpload 类的方法解析 request 时。

请提出一些好的方法如何通过获取所需的表单字段来实现多个文件上传,就像在 Jersey 中的 @FormDataParam 一样简单。

多文件上传方法:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@Path("/multipleFiles")
public String restDemo(@Context HttpServletRequest request) 
{
  //...code goes here
}

我的表单:

enter image description here

输出:(解析请求后)

field1 > abc
field2 > xyz
Chrysanthemum.jpg Size: 879394
Desert.jpg Size: 845941
Hydrangeas.jpg Size: 595284
Jellyfish.jpg Size: 775702

最佳答案

如果字段有相同的名称,像这样:

<form name="formtest" action="rest/multipleFiles" method="POST" enctype="multipart/form-data">
    <input type="text" name="atext" value="abc" />
    <input type="text" name="btext" value="123" />
    <input type="file" name="zfile" value="" />
    <input type="file" name="zfile" value="" />
    <input type="submit" value="submit" />
</form>

您可以使用:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@Path("/multipleFiles")    
public String restDemo(@FormDataParam("zfile") List<FormDataBodyPart> zfile)

现在,我建议不要使用 HttpServletRequest。如果您需要处理所有内容,请使用:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)    
@Produces(MediaType.APPLICATION_JSON)
@Path("/multipleFiles")
public String restDemo(FormDataMultiPart formParams) {
    formParams.getFields();
}

关于java - 在 Jersey 中使用@Context HttpServletRequest 和@FormDataParam 进行多文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17174485/

相关文章:

java - Jenkins SQLServer 选择参数 - 从数据库中检索数据

java - 如何在 IntelliJ 中调用现有的 IDE 操作?

java - 如何使用 JAXB 编码 Map<String, List<Objects>>

java - 我应该如何在我的 RESTful JAX-RS Web 服务中记录未捕获的异常?

java - Spring 安全和 Jersey : no automatic redirection to the login site

java - 使用公钥进行 RSA 解密

java - Spring MVC,用IF语句将数据发送到MySQL

java - 在单元测试期间模拟数据源

javascript - 如何捕获 Javascript TypeError?

java - 在 Jersey 请求中获取客户端语言环境