2015-08-21 97 views
0

我已經在Jersey中編寫了一個Rest服務來上傳多個文件。如下所示。但是我想要Restservice類中的屬性名稱,即name =「metadata」和name =「file」。Jersey FormData,上傳多個文件數據

 Select XML file 1: <input type="file" **name="metadata"** size="45" accept=".xml" /> 


     Select PDF file 2: <input type="file" **name="fileak**" size="45" accept=".pdf" /> 

選擇XML文件1:

選擇PDF文件2:

@POST 
    @Path("/upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response uploadFile(
      @FormDataParam("file") List<FormDataBodyPart> parts) { 
     for (FormDataBodyPart part : parts) { 
      FormDataContentDisposition disp = part 
        .getFormDataContentDisposition(); 
      InputStream in = part.getValueAs(InputStream.class); 
     } 

     return Response.ok(" uploaded successfully !!").build(); 
    } 

FormDataContentDisposition僅從表單中抽取內容類型,文件名,而不是輸入類型name =「」屬性。

任何幫助將不勝感激。

我使用HTML發佈請求,如下所示。

發佈HTML文件。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta content="text/html;charset=utf-8" http-equiv="Content-Type" /> 
     <meta content="utf-8" http-equiv="encoding" /> 

     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
     <script type="text/javascript"> 

     $(document).ready(function() 
     { 
      $("#uploadBtn").click(function() 
      { 
       $('input[type="file"]').each(function(index, value) 
       { 


        var nameValue=value.attributes[0].value; 
        var file = value.files[0]; 

        if(file) 
        { 
         var formData = new FormData(); 

         formData.append('file', file); 
         //formData["name"] = nameValue; 

         $.ajax({ 
          url : '/publicationservice-web/v1/publication/upload', 
          type : 'POST', 
          data : formData, 
          cache : false, 
          contentType : false, 
          processData : false, 
          name:nameValue, 
          success : function(data, textStatus, jqXHR) { 
           var message = jqXHR.responseText; 
           $("#messages").append("<li>" + message + "</li>"); 
          }, 
          error : function(jqXHR, textStatus, errorThrown) { 
           $("#messages").append("<li style='color: red;'>" + textStatus + "</li>"); 
          } 
         }); 
        } 
       }); 
      }); 
     }); 
     </script> 
</head> 
<body> 
    <h1>NGBulletin Upload System - Metadata and PDF</h1> 

    <form action="v1/publication/upload" method="post" enctype="multipart/form-data"> 

     <p> 
      Select XML file 1: <input type="file" name="metadata" id="metadata" size="45" accept=".xml" /> 
     </p> 
     <p> 
      Select PDF file 2: <input type="file" name="fileak" id="fileak" size="45" accept=".pdf" /> 
     </p> 

     <p> 
      <input id="uploadBtn" type="button" value="Upload PFD Files" /> 
     </p> 

    </form> 

    <ul id="messages"> 
    </ul> 

</body> 
</html> 

回答

3

的事情是,在@FormDataParam("file")價值名稱。當你想要通過名稱提取所有部分時,可以使用它。例如,你可以有

post(@FormDataParam("metadata") InputStream metaIn, 
    @FormDataParam("metadata") FormDataContentDisposition metaFcd, 
    @FormDataParam("fileak") InputStream fileakIn, 
    @FormDataParam("fileak") FormDataContentDisposition fileakFcd) { 
} 

但是,如果你想通過所有的部分你自己迭代,你應該使用FormDataMultiPart而不是List<FormDataBodyPart>。您可以獲取地圖,並將其作爲關鍵字。此外,該名稱在FormDataBodyPart.getName()中提供。例如

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadAsset(FormDataMultiPart multipart) { 

    Map<String, List<FormDataBodyPart>> map = multipart.getFields(); 

    for (Map.Entry<String, List<FormDataBodyPart>> entry : map.entrySet()) { 

     for (FormDataBodyPart part : entry.getValue()) { 
      InputStream in = part.getEntityAs(InputStream.class); 
      String name = part.getName(); 
      System.out.println("--- name: " + name); 
     } 
    } 
    return Response.ok("cool upload").build(); 
} 

的一點是,這是很沒有意義的嘗試,並取得名稱(編程),如果你要使用@FormDataParam annatotion,因爲你最終已經硬編碼的名稱(在標註值) ,所以你已經知道了。

+0

嗨PeesKilet ..我也加了我的HTML,你可以請看看....似乎代碼只是返回我的「文件」和「文件」,而不是名稱屬性即元數據和fileak – user3211037

+0

你需要將它們附加爲部分。您只添加一個部分(「文件」部分)。 「元數據」和「fileak」應該是不同的部分。 –

+0

或者實際上,再次查看,您正在通過所有類型的文件迭代('$('input [type =「file」]')。each)'併爲每個字段分別發出ajax請求。您可能應該將它們合併爲一個請求 –