从客户端将文件作为参数发送到REST服务?

时间:2013-03-07 04:15:16

标签: java rest jersey

我的要求是通过一个客户端将文件发送到REST服务。该服务将处理该文件。我正在使用Jersey API来实现这一点。但是我在很多文章中搜索过,没有任何关于如何从客户端传递文件的信息和 REST服务将如何检索文件 ...如何实现这个目标?

我没有使用Servlets来创建REST服务。

2 个答案:

答案 0 :(得分:10)

假设您在客户端和服务器端都使用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>

根据需要调整依赖项版本

答案 1 :(得分:1)

我是否正确地假设,因为它是一个MimeMultipart类型,我只能通过添加包含不同的多个MimeBodyPart来发送一个,但多个文件或附加信息可能是String或其他什么,只做一个简单的帖子文件或其他什么?比如:

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);