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

时间:2013-06-18 16:44:31

标签: java spring-mvc jersey jax-rs

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

更简单的方法是使用@FormDataParam,其中webservice用于暴露客户端需要通过的参数,但问题是我无法一次上传多个文件。

如果媒体类型或enctype为request.getParameter("field1");,也无法使用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
}

我的表单:

enter image description here

输出:(解析请求后)

  

field1> ABC
  field2> XYZ
  Chrysanthemum.jpg尺寸:879394
  Desert.jpg尺寸:845941
  Hydrangeas.jpg尺寸:595284
  Jellyfish.jpg   大小:775702

1 个答案:

答案 0 :(得分: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>

您可以使用:

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