泽西图像上传客户端

Posted

技术标签:

【中文标题】泽西图像上传客户端【英文标题】:Jersey Image Upload Client 【发布时间】:2015-03-07 17:43:03 【问题描述】:

我正在尝试使用 Jersey webservice 上传图片,我正在使用 jersey 客户端上传图片。 下面是泽西网络服务,它接受输入流并在服务器上上传图像。当我使用 jsp multipart form upload 直接调用它时它工作正常,但当我使用 jersey 客户端上传图像时失败

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) throws ServiceException

    // upload code

下面是 Jersey 客户端上传图片,客户端代码是另一个 web 服务的一部分,从 php rest 客户端调用,这个 jersey 客户端调用 jersey web 服务上传图片,如果我直接调用 jersey web 服务上传图片那工作很好,但是当我使用球衣客户端上传时它不起作用。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
client.setChunkedEncodingSize(1024);
WebResource wr = client
        .resource("http://localhost:8080/rest/upload");

String contentDisposition = "attachment; filename=\""
        + fileDetail.getName() + "\"";
FormDataMultiPart form = new FormDataMultiPart();
ContentDisposition contentDisposition2 = new ContentDisposition(contentDisposition);
form.setContentDisposition(contentDisposition2);
FormDataBodyPart fdp = new FormDataBodyPart("file",
        uploadedInputStream, MediaType.MULTIPART_FORM_DATA_TYPE);
form.bodyPart(fdp);
ClientResponse response = wr.type(MediaType.MULTIPART_FORM_DATA).post(
        ClientResponse.class, form)

请帮助我不确定我在这里缺少什么。 谢谢。

【问题讨论】:

你能解释一下“不工作”是什么意思吗?我使用您的确切代码进行了测试,使用FileInputStream 类型为uploadedInputStream,它工作正常。我会改变的一件事(虽然它并没有导致它对我来说失败)是MediaType.MULTIPART_FORM_DATA_TYPE for fdp to MediaType.APPLICATION_OCTET_STREAM_TYPE 我的意思是它正在将 UploadedInputStream 传递给 jersey webservice,但它不包含我们从 jersey 客户端传递的相同块和相同内容类型。 form-data 是请求的主要内容类型。但是表单数据带有部分,每个部分都有自己的内容类型。该文件应该是八位字节流而不是表单数据 @peeskillet,你说得对,应该是 MediaType.APPLICATION_OCTET_STREAM_TYPE 【参考方案1】:

这是一个使用 jersey 客户端和 web 服务上传图像的完整示例 客户端代码

public class Test 

    private static URI getBaseURI() 
        return UriBuilder.fromUri("http://localhost:8080/restfullwebservice/resources/generic").build("");
    

    public static void main(String[] args) throws FileNotFoundException 
        final ClientConfig config = new DefaultClientConfig();
        final Client client = Client.create(config);

        final WebResource resource = client.resource(getBaseURI()).path("upload");

        final File fileToUpload = new File("C:/Users/Public/Pictures/Desert.jpg");

        final FormDataMultiPart multiPart = new FormDataMultiPart();
        if (fileToUpload != null) 
            multiPart.bodyPart(new FileDataBodyPart("file", fileToUpload,
                    MediaType.APPLICATION_OCTET_STREAM_TYPE));
        

        final ClientResponse clientResp = resource.type(
                MediaType.MULTIPART_FORM_DATA_TYPE).post(ClientResponse.class,
                multiPart);
        System.out.println("Response: " + clientResp.getClientResponseStatus());

        client.destroy();
    

网络服务服务器代码

@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) throws ServiceChannelException 
    OutputStream os = null;
    try 
        File fileToUpload = new File("C:/Users/Public/Pictures/Desert1.jpg");
        os = new FileOutputStream(fileToUpload);
        byte[] b = new byte[2048];
        int length;
        while ((length = uploadedInputStream.read(b)) != -1) 
            os.write(b, 0, length);
        
     catch (IOException ex) 
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
     finally 
        try 
            os.close();
         catch (IOException ex) 
            Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
        
    

完整应用 https://github.com/abdotalaat/upladeimageusingjersy

【讨论】:

你没事吧?请注意,完整的项目是 Netbeans 项目 哦,我明白了,我从未尝试过使用 netbeans,但现在我会尝试一下。感谢您的帮助。

以上是关于泽西图像上传客户端的主要内容,如果未能解决你的问题,请参考以下文章

泽西 SSE 客户端不工作

泽西客户端异步 POST 请求不等待响应

Glassfish:泽西客户端中的MessageBodyProviderNotFoundException

客户端响应过滤器读取实体问题(泽西)

泽西岛客户端:如何添加列表作为查询参数

从泽西客户端调用 post API 时出现 415 错误