使用带有@FormDataParam的@Context HttpServletRequest进行多文件上传

agp*_*gpt 8 java jax-rs spring-mvc jersey

我已经创建了一个平针织的restful web服务,我设法使用方法签名上传多个文件@Context HttpServletRequest request,这很好地工作.
事实上,要获取其他表单字段,我需要重复检查带有.isFormField();相对.getName();文件的方法.getFieldName();,以及每次调用Web服务时.getString();检查是否存在必需字段的方法,如果有的话,我认为这个过程很费时其他几个领域.

更容易的方法是使用@FormDataParamwebservice用于暴露客户端需要通过的参数的地方,但问题是我无法一次上传多个文件.

因为request.getParameter("field1");如果媒体类型或enctype是,它也不可能用于获取其他表单字段multipart/form-data.

每当我试图结合两者@FormDataParam@Context HttpServletRequest request在一起,它抛出异常:
org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed
在解析请求.parseRequest(request);的方法ServletFileUpload类.

请建议一些好的方法如何获得多个文件上传,并获得所需的表单字段,就像@FormDataParam在球衣一样简单.

多文件上传的方法:

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

我的表格:

在此输入图像描述

输出:(解析请求后)

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

Mar*_*ski 16

如果字段具有相同的名称,则如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

您可以使用:

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

现在,我建议不要使用HttpServletRequest.如果您需要处理所有内容,请使用以下命令:

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

  • 如果你使用与Jersey混合的HttpServletRequest,它可能会关闭流,缓冲区,然后才能使用它们.因为JAX-RS是为了避免直接使用Servlet.现在,有些情况下您可能需要直接与servlet交互,但仅在必要时才需要.这完全取决于您的Web容器和JAX-RS实现,Tomcat/Glassfish/JBoss与Jersey/CXF/Resteasy. (7认同)
  • @Maxrunner使用`List <FormDataBodyPart>` (3认同)