我已经成功地开发服务,在我读在新泽西州多形式上传的文件。 这里是我一直在做一个非常简化的版本:
@POST
@Path("FileCollection")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException {
//handle the file
}
这工作得很好,但我已经被赋予了新的要求。 除了我上传文件,我要处理的资源任意数量。 假设这些图像文件。
我想我只是为客户端提供一个形式与该文件的一个输入,所述第一图像的一个输入和一个按钮,以允许添加更多的输入(使用AJAX或简单普通的JavaScript)的形式。
<form action="blahblahblah" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="file" name="image" />
<input type="button" value="add another image" />
<input type="submit" />
</form>
因此,用户可以添加与图像,这样更投入的形式:
<form action="blahblahblah" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="file" name="image" />
<input type="file" name="image" />
<input type="file" name="image" />
<input type="button" value="add another image" />
<input type="submit" />
</form>
我希望这将是足够简单,具有相同的名称作为一个集合阅读领域。 我在MVC .NET文本输入成功地做到了,我认为这不会在泽西更难。 事实证明我错了。
在发现没有关于该问题的教程,我开始试验。
为了看看如何做到这一点,我简单化的问题,到简单的文字输入。
<form action="blahblabhblah" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Multiple inputs with the same name</legend>
<input type="text" name="test" />
<input type="text" name="test" />
<input type="text" name="test" />
<input type="text" name="test" />
<input type="submit" value="Upload It" />
</fieldset>
</form>
很显然,我需要有某种形式的集合作为参数传递给我的方法。 这里是我的尝试,通过集合类型进行分组。
排列
起初,我检查是否泽西足够聪明来处理一个简单的数组:
@POST
@Path("FileCollection")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("test") String[] inputs) {
//handle the request
}
但如预期未注入的阵列。
MultiValuedMap
已经悲惨地失败了,我记得MultiValuedMap
对象可以开箱处理。
@POST
@Path("FileCollection")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(MultiValuedMap<String, String> formData) {
//handle the request
}
但它并不能工作。 这一次,我得到了一个异常
SEVERE: A message body reader for Java class javax.ws.rs.core.MultivaluedMap,
and Java type javax.ws.rs.core.MultivaluedMap<java.lang.String, java.lang.String>,
and MIME media type multipart/form-data;
boundary=----WebKitFormBoundaryxgxeXiWk62fcLALU was not found.
有人告诉我,这种异常可能会被摆脱了由包括mimepull
库,所以我增加了以下依赖我的POM:
<dependency>
<groupId>org.jvnet</groupId>
<artifactId>mimepull</artifactId>
<version>1.3</version>
</dependency>
不幸的是,问题仍然存在。 这也可能是选择正确的身体读者,并使用用于通用不同参数的问题。 我不知道如何做到这一点。 我想消费两种文件和文本输入,以及其他一些人(主要是Long
价值和自定义参数的类)。
formdatamultipart
一些研究之后,我发现FormDataMultiPart类。 我已经成功地用它来从我的形式提取字符串值
@POST
@Path("upload2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadMultipart(FormDataMultiPart multiPart){
List<FormDataBodyPart> fields = multiPart.getFields("test");
System.out.println("Name\tValue");
for(FormDataBodyPart field : fields){
System.out.println(field.getName() + "\t" + field.getValue());
//handle the values
}
//prepare the response
}
问题是,这是我的问题的简化版本的解决方案。 虽然我知道,泽西注入每一个参数是通过在某个点解析字符串创建(难怪,这是HTTP毕竟),我有一些经验写我自己的参数类,我真的不如何将这些领域转化成InputStream
或File
进行进一步的处理实例。
因此,在深入泽西源代码,看看如何创建这些对象之前,我决定在这里问是否有读一组文件(未知大小)的简单方法。 你知道如何解决这个难题?