Java Jersey Client上载与命名控件关联的多个文件

时间:2016-10-11 12:20:07

标签: jersey-client

我无法弄清楚如何让Java Jersey Client(https://jersey.java.net/documentation/latest/client.html)代码执行某些操作。我有一个能够上传多个文件的应用程序。请参阅以下HTML。

<form action="http://localhost:8080/app/rest/files/uploadMultipleFiles" method="post"
                                               enctype="multipart/form-data">  
 <p>  
   Select a file to Upload to server: 
   <input type="file" name="files" size="60" multiple=“multiple”/>  
 </p>  
 <input type="submit" value="Upload File" />  
</form>  

注意:任何上传的文件都将与输入控件名称“files”相关联。

服务器代码执行以下操作:

@Path("/uploadMultipleFiles")
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFiles(final FormDataMultiPart multiPart)
{ 
  //Get contents of control named “files”
    List<FormDataBodyPart> bodyParts = multiPart.getFields("files");
    /* Save multiple files */
    if (bodyParts != null)
    {

        for (int i = 0; i < bodyParts.size(); i++)
        {

            BodyPartEntity bodyPartEntity = (BodyPartEntity) bodyParts.get(i).getEntity();
            String fileName = bodyParts.get(i).getContentDisposition().getFileName();
            try
            {
                String path = temporaryUploadDirectory + File.separator + fileName;
                long size = saveFile(bodyPartEntity.getInputStream(), path);

...。 它使用HTML输入控件名称“files”来获取列表的上传文件列表。然后,它可以作为BodyPartEntity访问每个文件。

我很难弄清楚如何让Jersey客户端上传代码,以便文件与控件名称“files”相关联。我想编写客户端代码以这种方式上传到服务器(服务器代码正常工作之前的HTML片段。我希望Jersey客户端代码以完全相同的方式发送数据,但无法弄清楚如何)。

我可以将代码放在一起为每个要上传的文件创建FileDataBodyPart。但我不知道如何将它们与名为“files”的控件关联起来:

List<FileDataBodyPart> bodyParts = new ArrayList<FileDataBodyPart>();
//get files to upload from file system
File dir = new File(classLoader.getResource("uploadTestDirectory").getFile());
if (dir.exists())
{
    File[] files = dir.listFiles();
    int count = 0;
    forFile f : files)
    {
       //Create a FileDataBodyPart for each file from uploadTestDirectory. Add to a list 
       bodyParts.add(new FileDataBodyPart("file" 
                       + count, new File(f.getAbsolutePath()),
                        MediaType.APPLICATION_OCTET_STREAM_TYPE));
       count++;        
    }

    WebTarget webTarget = client.target("http://localhost:8080/app/rest").path("files")
                                     .path("uploadMultipleFiles");

    //FOLLOWING IS THE FormDataMultiPart to upload
    FormDataMultiPart multiPart = new FormDataMultiPart();
    multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);

    //add the file body parts
    for (FileDataBodyPart bp : bodyParts)
    {
        multiPart.bodyPart(bp);
    }

    Response clientResponse =
            webTarget.request(MediaType.APPLICATION_JSON).post(
                 Entity.entity(multiPart, multiPart.getMediaType()));
}

我的问题:如何修改上面的代码,以便文件(FileDataBodyPart对象)包含在名为“files”的控件下(就像我的服务器代码所期望的那样,就像顶部的HTML一样)。

我可以使用上述客户端代码上传文件,但无法找到将它们与“文件”控件相关联的方法。这有意义吗?

任何帮助将不胜感激。 -Andrew

1 个答案:

答案 0 :(得分:0)

似乎没有对此的支持:

https://jersey.java.net/apidocs/2.6/jersey/org/glassfish/jersey/media/multipart/FormDataMultiPart.html

请参阅“TODO考虑支持嵌套多部分/混合正文部分的用例以包含多个上传文件。”