首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JAVA中上传750 to的文件,使用jersey-client V2.13 (从客户机到服务器)?

如何在JAVA中上传750 to的文件,使用jersey-client V2.13 (从客户机到服务器)?
EN

Stack Overflow用户
提问于 2014-10-26 17:01:35
回答 1查看 1.8K关注 0票数 0

在开始解释我的问题之前,我想和您分享一下我使用的库版本和服务器:

代码语言:javascript
复制
javax.ws.rs-api: 2.0.1
jersey-container-servlet: 2.13
jersey-media-multipart: 2.13
jackson: 2.4.3  

I also use Apache Tomcat Server version 7.0.55. 

所以我把它编码如下:

代码语言:javascript
复制
    /**
     * On the client side.
     */
public void uploadAFile() {
    Client client = ClientBuilder.newBuilder()
            .register(MultiPartFeature.class)
            .build();

    WebTarget target = null;
    try {
        target = client
                .target("https://blo-bla.rhcloud.com/rest")
                .path("v1").path("upload");
    } catch (IllegalArgumentException | NullPointerException e) {
        LOG_TO_CONSOLE.fatal(e, e);
        LOG_TO_FILE.fatal(e, e);
    }

    Builder builder = target.request(MediaType.TEXT_PLAIN);
    builder.header("Authorization",
    getValidBasicAuthenticationStrEncrypted());

    FormDataMultiPart form = new FormDataMultiPart();
    form.field("anotherParam", "Bozo");

    String fileName = "/Users/drizzy/Documents/Divx/CaseDepartFolder/sample.avi";

    File file = new File(fileName);
    form.bodyPart(new FileDataBodyPart("file", file,
            MediaType.APPLICATION_OCTET_STREAM_TYPE));

    Response response = builder.post(Entity.entity(form,
            MediaType.MULTIPART_FORM_DATA_TYPE));

    LOG_TO_CONSOLE.debug(response.getStatus());
    LOG_TO_CONSOLE.debug(response.readEntity(String.class));
}


   /**
     * On the server side.
     */
    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.TEXT_PLAIN)
    public String uploadFile(@FormDataParam("file") InputStream fileInputStream,
                             @FormDataParam("file") FormDataContentDisposition fileDisposition,
                             @FormDataParam("anotherParam") String str) 
                             throws FileNotFoundException, IOException 
    {
        System.out.println("str: " + str);
        final String basePath = "/Users/drizzy/eclipse-workspace/tomcat7jbossews"
                                + "/src/main/resources/uploads/";

        final String fileName = fileDisposition.getFileName();
        System.out.println(new StringBuilder().append("***** fileName ")
                                              .append(fileName)
                                              .toString());

        final String filePath = new StringBuilder().append(basePath)
                                                   .append(fileName)
                                                   .toString();
        System.out.println(filePath);

        try (OutputStream fileOutputStream = new FileOutputStream(filePath)) {
            int read = 0;
            final byte[] bytes = new byte[1024];
            while ((read = fileInputStream.read(bytes)) != -1) {
                fileOutputStream.write(bytes, 0, read);
            }
        }

        return "File Upload Successfully !!";
    }

它在客户端生成这些异常:

代码语言:javascript
复制
Java Heap space error 

代码语言:javascript
复制
Java binding Exception: Already connected

所以,我的问题是,如果有人能给我提供一个代码的例子,与一个客户端使用泽西-客户端V2.13,它将一个大文件从客户端上传到服务器?或者甚至可以告诉我上面的代码有什么问题?

注意:我只想使用jersey版本V2.13来处理这个问题,所以请不要使用第三方库或不使用jersey版本的V2.13来提供解决方案。

EN

回答 1

Stack Overflow用户

发布于 2014-10-27 07:35:34

好的,问题似乎是一个很大的文件(350 it ),而且您遇到了各种限制。因此,我建议以另一种方式处理这个问题。

可能的解决办法:

  1. 将文件拆分到客户端,并通过“较小的”部件上传到服务器,在服务器上按原顺序组装回文件。
  2. 将文件流到服务器:http://commons.apache.org/proper/commons-fileupload/streaming.html

我更喜欢2.解决方案,因为它可能是最容易实现的。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26575541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档