2013-03-07 65 views
4

我的要求是通過一個客戶端將文件發送到REST服務。該服務將處理該文件。我正在使用Jersey API來實現這一點。但我已經在很多文章中搜索過,沒有任何有關的信息如何從客戶端傳遞文件REST服務如何檢索文件 ...如何實現這一目標?從客戶端將文件作爲參數發送到REST服務?

而我沒有使用Servlets創建REST服務。

+1

你檢查下面的鏈接? http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/ – KSHiTiJ 2013-03-07 04:20:09

+0

謝謝你這個鏈接是有用的。但是在這個鏈接中有服務獲取文件的方式以及如何上傳文件的信息。我的要求是客戶端將如何通過發送文件作爲參數調用此fileUploadservice ..這是文件在客戶端。它會將文件發送到REST服務用於某種目的。 – 2013-03-07 04:33:45

回答

9

假設你在客戶端和服務器端都使用澤西島,這裏是一些代碼,你可以擴展:

服務器端:

@POST 
@Path("/") 
@Produces(MediaType.TEXT_PLAIN) 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(final MimeMultipart file) { 
    if (file == null) 
     return Response.status(Status.BAD_REQUEST) 
       .entity("Must supply a valid file").build(); 

    try { 
     for (int i = 0; i < file.getCount(); i++) { 
      System.out.println("Body Part: " + file.getBodyPart(i)); 
     } 
     return Response.ok("Done").build(); 
    } catch (final Exception e) { 
     return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e) 
       .build(); 
    } 
} 

上面的代碼實現了接受郵政的資源方法多部分(文件)數據。它還說明了如何迭代傳入(多部分)請求中的所有單個正文部分。

客戶:

final ClientConfig config = new DefaultClientConfig(); 
final Client client = Client.create(config); 

final WebResource resource = client.resource(ENDPOINT_URL); 

final MimeMultipart request = new MimeMultipart(); 
request.addBodyPart(new MimeBodyPart(new FileInputStream(new File(
     fileName)))); 

final String response = resource 
    .entity(request, "multipart/form-data") 
    .accept("text/plain") 
    .post(String.class); 

上面的代碼簡單地將文件附加到一個多部分請求,並觸發請求斷開到服務器。對於客戶端和服務器端代碼,都依賴Jersey和JavaMail庫。如果您正在使用Maven,這些可以很容易地拉下來,用下面的依賴關係:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-core</artifactId> 
    <version>1.17</version> 
</dependency> 

<dependency> <!-- only on server side --> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.14</version> 
</dependency> 

<dependency> <!-- only on client side --> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>1.17</version> 
</dependency> 

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.17</version> 
</dependency> 

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>1.4.6</version> 
</dependency> 

調整依賴版本要求

+0

非常感謝你......這是我真正期望的。你能告訴MimeMulitpart的Maven的依賴..我用下面的依賴 \t \t \t com.sun.jersey.contribs \t \t \t 球衣,多 \t \t \t 1.17.1 \t \t ......這是正確的嗎? – 2013-03-07 05:13:30

+0

@AnandMurugan - 不,你不需要依賴。我已經將你需要的核心部分添加到了我的答案中。 – Perception 2013-03-07 05:19:01

+0

我更改了代碼更改。但現在我得到404未找到的例外...但是,當我點擊URL時,它響應...但是,在執行post之後,再次發生excpetion ...我的服務正在url http:// myhost/agent中運行。我在Service Class中添加了@Path(「/ upload」),並在uploadFile方法中添加了@Path(「transfer」)....再次想知道代碼中的錯誤是什麼? – 2013-03-07 12:48:37

0

我說得對假設,因爲它是一個MimeMultipart的類型,我不能只發送一個,但多個文件或附加信息可能是字符串或其他,只做一個簡單的帖子,只需添加多個包含不同文件的MimeBodyParts?例如像:

final MimeMultipart request = new MimeMultipart(); 
request.addBodyPart(new MimeBodyPart(new FileInputStream(new File(
    fileOne))), 0); 
request.addBodyPart(new MimeBodyPart(new FileInputStream(new File(
    fileTwo))), 1); 

相關問題