8

我创建了一个 jersey restful web 服务,我设法使用作为方法签名上传多个文件@Context HttpServletRequest request,效果很好。
问题是,要获取其他表单字段,我需要.isFormField();使用 relative .getName();for file or的方法反复检查.getFieldName();,以及每次调用 Web 服务时.getString();检查所需字段是否存在的方法,如果有的话,我认为这个过程不会很冗长且昂贵其他几个领域。

更简单的方法是使用@FormDataParamweb 服务用于暴露客户端需要传递的参数的位置,但问题是我无法一次上传多个文件。

因为如果 media type 或 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
}

我的表格:

在此处输入图像描述

输出:(解析请求后)

field1 > abc
field2 > xyz
Chrysanthemum.jpg 大小: 879394
Desert.jpg 大小: 845941
绣球花.jpg 大小: 595284
Jellyfish.jpg 大小: 775702

4

1 回答 1

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();
}
于 2013-07-11T06:18:51.247 回答