0

我在使用 Android 上的 Jersey 客户端 API 的 Multipart-form-data POST 请求时遇到问题。我一直在关注网络上的各种示例,它们在实现方面都非常相似。

Client client = createClientInstance();
WebResource r = client.resource(BASEURL).path("DataUpload");
ClientResponse post;
try {
    FormDataMultiPart multiPart = new FormDataMultiPart();
    multiPart.field("account", account);
    multiPart.field("checksum", checksum);
    multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
    post = r.type(MediaType.MULTIPART_FORM_DATA)
        .accept(MediaType.TEXT_PLAIN)
        .post(ClientResponse.class, multiPart);

} catch (ClientHandlerException e) {
    Log.e(TAG, e.getLocalizedMessage());
} finally {
    client.destroy();
}

当我在设备上执行此代码时,出现异常:

javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException: No MessageBodyWriter for body part of type 'java.io.File' and media type 'application/octet-stream'

我认为 Jersey 应该在没有任何额外配置的情况下处理 File 对象。删除 bodypart 行将允许 Jersey 提出请求,但这消除了这一点。

我的构建路径上有这些库(使用 Maven 引入):

  • jersey-client-1.14
  • jersey-core-1.14
  • jersey-multipart-1.14
  • mimepull-1-6
4

1 回答 1

0

我可以建议尝试两件事:

  1. 从 FileDataBodyPart 构造中删除 MIME 类型,以查看 Jersey 是否可以找到它很高兴默认为的 MIME 类型:

    multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));

  2. 告诉您的客户端配置有关多部分正文编写器的信息(大概在您的createClientInstance()方法中):

    com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
    config.getClasses().add(MultiPartWriter.class);
    client = Client.create(config);
    

希望有帮助。

于 2012-10-22T03:23:52.657 回答