【问题标题】:Send File as a parameter to a REST Service, from a client?从客户端将文件作为参数发送到 REST 服务?
【发布时间】:2017-06-04 22:38:41
【问题描述】:

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

而且我没有使用 Servlet 来创建 REST 服务。

【问题讨论】:

  • 谢谢你这个链接很有用。但是在这个链接中,有关于服务如何获取文件以及如何上传文件的信息。我的要求是客户端将如何通过将文件作为参数发送来调用此文件上传服务。即文件在客户端。它会出于某种目的将文件发送到 REST 服务。

标签: java rest jersey


【解决方案1】:

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

根据需要调整依赖版本

【讨论】:

  • 非常感谢...这正是我所期望的。您能否告诉 MimeMulitpart 的 Maven 依赖关系。我正在使用以下依赖关系 com.sun.jersey.contribsjersey-multipart1.17.1 ...那个正确吗?
  • @AnandMurugan - 不,你不需要那种依赖。我已将您需要的核心内容添加到我的答案中。
  • 我已更改代码更改。但是现在我得到了 404 Not found 的异常...但是当我点击 URL 时它会响应...但是在执行帖子之后再次发生异常...我的服务在 url myhost/agent 中运行。我在服务类中添加了@Path("/upload"),还在uploadFile方法中添加了@Path("transfer")....再次想知道代码有什么问题?
  • 如果您向资源方法添加了特定路径,则需要将其包含在客户端的 URL 中。所以例如http://myhost:9999/agent/upload/transfer,而不是http://myhost:9999/agent/upload
  • 代码运行良好。但我的要求只是将文件从客户端上传到服务器。所以我不想要 MIMEMulitpart 类型。因为我无法获得传输的确切文件。例如,如果我正在发送一个文本文件,在服务器端写入文件时,使用“--null”内容创建的文本文件。如果我正在传输 zip 文件,则会以错误的格式写入并且无法查看 zip 文件。如果我们可以使用 MIMEMultipart 传递文件,则意味着如何在服务器端代码中获取确切的文件。请帮我搞定这个?
【解决方案2】:

我是否正确假设,因为它是 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);

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多