2014-10-27 91 views
3

我遇到了一些麻煩,在將多部分/表單數據發佈到我製作的RESTful Web服務中。我正嘗試通過RESTful Web服務上傳媒體文件(圖像,視頻,音頻)。我搜索周圍找到最好的方法來做到這一點,並發現POST多部分/表單數據是最好的解決方案。狀態碼415:否MessageBodyReader發現多部分/表單數據,FormDataMultiPart

問題是,當我發佈一些多/表單數據我在Tomcat服務器收到此錯誤信息:

SEVERE MessageBodyReader not found for media type=multipart/form-data; boundary=----WebKitFormBoundaryTg7uVLcYJ3lsBpQE, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.FormDataMultiPart. 

我也嘗試找上計算器找到一個答案,這個問題似乎是,一個mimepull.jar失蹤了很多人。我檢查了一下,以確保mimepull.jar在我的類路徑中,而且確實如此,所以這不是問題。此時我卡住了。

這裏是我在我的pom.xml依賴關係:

<dependencies> 
    <dependency> 
     <groupId>org.eclipse.persistence</groupId> 
     <artifactId>eclipselink</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>6.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>2.12</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet-core</artifactId> 
     <version>2.12</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.4.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.12</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-multipart</artifactId> 
     <version>2.12</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.4.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.4.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.4.2</version> 
    </dependency> 
</dependencies> 

下面是相關的後端代碼來處理的multipart/form-data的文章:

@POST 
@Path("media") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response uploadFile(FormDataMultiPart form) { 

    FormDataBodyPart filePart = form.getField("file"); 
    ContentDisposition headerofFilePart = filePart.getContentDisposition(); 
    InputStream uploadedInputStream = filePart.getValueAs(InputStream.class); 

    String uploadedFileLocation = "C:\\surveymedia\\media" + headerofFilePart.getFileName(); 

    try { 
     saveFile(uploadedInputStream, uploadedFileLocation); 
    } catch (Exception e) { 
     return Response.status(400).entity(e.getCause()).build(); 
    } 

    String output = "File uploaded to: " + uploadedFileLocation; 
    return Response.status(200).entity(output).build(); 
} 

最後這裏是測試頁面我用於測試將文件發送到後端:

<html> 
    <head> 
     <title></title> 
    </head> 
    <body> 
     <h1>File Upload with Jersey</h1> 

     <form action="/rest/surveys/media" method="post" enctype="multipart/form-data"> 

     <p> 
      Select a file : <input type="file" name="file" size="45" /> 
     </p> 

     <input type="submit" value="Upload It" /> 
     </form> 
    </body> 
</html> 

讓我知道你是否需要更多信息。先謝謝您的幫助!

回答

0

當我通過Jersey實現一個文件上傳器時遇到了類似的問題,所以我最終採取了一種稍微不同的方法,其中方法的參數是InputStream和FormDataContentDisposition對象。

下面是一個例子;也許這會適合你:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces({MediaType.APPLICATION_JSON}) 
public Response uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream, 
    @FormDataParam("file") FormDataContentDisposition fileDetail) throws Exception { 

    String filename = fileDetail.getFileName(); 
    String uploadedFileLocation = "C:\\surveymedia\\media" + filename; 
    try { 
     saveFile(uploadedInputStream, uploadedFileLocation); 
    } 
    catch(Exception e){ 
     return Response.status(400).entity(e.getCause()).build(); 
    } 

    String output = "File uploaded to: " + uploadedFileLocation; 
    return Response.status(200).entity(output).build(); 
} 
+0

忘記這個問題,所以非常抱歉,非常晚的答覆。這正是我最終選擇的答案。 – SuperMex88 2014-11-10 13:58:48