我的要求是通过一个客户端将文件发送到 REST 服务。该服务将处理该文件。我正在使用 Jersey API 来实现这一点。但是我在很多文章中搜索过,没有任何关于如何从客户端传递文件以及REST服务如何检索文件的信息......如何实现这一点?
而且我没有使用 Servlet 来创建 REST 服务。
假设您在客户端和服务器端都使用 Jersey,下面是一些您可以扩展的代码:
服务器端:
@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();
}
}
上面的代码实现了一个资源方法,它接受 POST 的多部分(文件)数据。它还说明了如何遍历传入(多部分)请求中的所有单个正文部分。
客户:
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>
根据需要调整依赖版本
我是否正确假设,因为它是 MimeMultipart 类型,我不能只发送一个,而是多个文件或附加信息可能是字符串或其他,只做一个简单的帖子,只需添加多个包含不同文件的 MimeBodyPart 或其他? 例如像:
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);
等等