Jersey 2分段上传客户端

时间:2014-07-08 16:29:46

标签: java rest file-upload multipartform-data jersey-2.0

我想写一个简单的球衣2客户端来上传文件。我正在使用Jersey 2.10.1并编写了以下服务器代码:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response uploadFile(
        @FormDataParam("file") InputStream aUploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition aFileDetail) {

    UploadedFile uploadedFile = new UploadedFile();
    uploadedFile.setOriginalFileName(aFileDetail.getFileName());
    uploadedFile.setFileSize(aFileDetail.getSize());
    saveToFile(aUploadedInputStream, aFileDetail.getType(), uploadedFile);
    databaseHelper.saveInDatabase(uploadedFile);

    return Response.status(200).build();
}

(“UploadedFile”是一个自定义类,用于将文件信息保存在数据库中)

这是我的客户代码:

private static final String TARGET_URL = "http://localhost:49158/rest/service/upload";

public Slimclient() {
    Client client = ClientBuilder.newBuilder()
            .register(MultiPartFeature.class).build();
    WebTarget webTarget = client.target(TARGET_URL);
    MultiPart multiPart = new MultiPart();

    FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
            new File("C:/Users/Nicklas2751/Desktop/test.txt"), MediaType.APPLICATION_OCTET_STREAM_TYPE);
    multiPart.bodyPart(fileDataBodyPart);

    Response response = webTarget.request(
            MediaType.MULTIPART_FORM_DATA).post(
            Entity.entity(multiPart, multiPart.getMediaType()));

    System.out.println(response.getStatus()+" "+response.getStatusInfo()+" "+response);
}

public static void main(String[] args) {
    new Slimclient();
}

服务器代码运行没有任何问题,但是当我运行客户端时,我收到以下错误:

415 Unsupported Media Type InboundJaxrsResponse{ClientResponse{method=POST, uri=http://localhost:49158/rest/service/upload, status=415, reason=Unsupported Media Type}}

我在网上搜索了针对jersey 2和multipart fileupload的一个很好的教程,但我只能找到针对jersey 1或HTML-Form作为“Client”的教程和示例。我希望sombody可以帮助我:)。

2 个答案:

答案 0 :(得分:31)

我发现了自己的问题。我错过了设置MediaType的{​​{1}}和MultiPart我已将响应的预期.request(MediaType.MULTIPART_FORM_DATA)设置为MediaType。这是工作代码:

MULTIPART_FORM_DATA

答案 1 :(得分:0)

由于服务器端消耗了MediaType.MULTIPART_FORM_DATA,因此客户端代码可以直接使用FormDataMultiPart而不是MultiPart

FormDataMultiPart multiPart = new FormDataMultiPart();