Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jersey client V2.13(从客户端到服务器)在JAVA中上载750MB的文件?_Java_Rest_File Upload_Jersey_Jersey Client - Fatal编程技术网

如何使用jersey client V2.13(从客户端到服务器)在JAVA中上载750MB的文件?

如何使用jersey client V2.13(从客户端到服务器)在JAVA中上载750MB的文件?,java,rest,file-upload,jersey,jersey-client,Java,Rest,File Upload,Jersey,Jersey Client,在开始向您解释我的问题之前,我想与您分享我使用的库版本和服务器: 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. 因此,我将其编码如下: /** * On the client side. */ public void

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

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. 
因此,我将其编码如下:

    /**
     * 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 !!";
    }
在客户端生成以下异常:

Java Heap space error 

所以我的问题是,是否有人能给我提供一个使用jersey client V2.13的客户端的代码示例,该客户端使用jersey client V2.13将一个大文件从客户端上传到服务器?或者甚至可以告诉我上面的代码出了什么问题


注意:我只想使用jersey客户端版本V2.13来处理该问题,因此请不要向我提供使用第三方库或不使用jersey客户端版本V2.13的解决方案。

好的,问题似乎是一个非常大的文件(350Mb),您正在达到各种限制。因此,我建议以另一种方式解决这个问题

可能的解决办法:

  • 在客户机上拆分文件,并通过“较小”部分将其上载到服务器,然后按原始顺序重新组装
  • 将文件流式传输到服务器:
  • 我想要两个。解决方案,因为它可能是最容易实现的。
    希望这能有所帮助。

    我终于找到了解决问题的方法:

    1-用于修复“已连接”异常。

    Java7引入了默认启用的SNI支持。我发现某些配置错误的服务器会在SSL握手中发送“无法识别的名称”警告,而大多数客户端都会忽略该警告。。。除了Java。正如@Bob Kerns提到的,Oracle工程师拒绝“修复”这个bug/功能

    作为解决方法,他们建议设置jsse.enableSNIExtension属性。要允许您的程序在不重新编译的情况下工作,请以以下方式运行您的应用程序:

    "-Djsse.enableSNIExtension=false"
    
    这一信息的来源

    该属性也可以在Java代码中设置,但必须在任何SSL操作之前设置。加载SSL库后,可以更改属性,但不会对SNI状态产生任何影响。要在运行时禁用SNI(具有上述限制),请使用:

    2-用于修复chunkedTransferMode的激活和java堆空间错误。

    Java堆空间错误:我必须增加客户端使用的jvm内存:

    要在eclipse中执行此操作,请转到运行>运行配置…>选择客户端类>参数>虚拟机参数:

    -Xms1024m -Xmx2500m -XX:+PrintFlagsFinal
    
    我用自己来解决这个问题的消息来源:

    关于启用chunkedTransferMode的事实,我不需要这样做,因为我在jersey客户端的文档中发现chunkedTransferMode在jersey客户端V2.13中默认启用

    最后,我们将这些参数传递给客户端的JVM:

    "-Djsse.enableSNIExtension=false" "your classes ..." -Xms1024m -Xmx2500m -XX:+PrintFlagsFinal
    

    你对“大文件”有什么理解?包括Tomcat在内的大多数服务器在上传文件时都有限制(在配置中)。如果服务器有限制,而您不想更改,那么您就卡住了。如何改变它取决于框架,而不是容器:没有通用的技术。到底是什么错了?我没有说错话。如果你要告诉别人他们错了,你需要说明原因。我这里没说错什么。我的评论以“如果”开头,我没有否认或排除任何bug的存在。你需要更仔细地阅读,并准备好支持你的陈述。你介绍了这个主题,所以它不可能是无关紧要的。我的解决方案与我之前在这个主题上所做的所有文章都是一样的,包括昨天可能是你的,现在显然被删除了。找到一种启用分块传输模式的方法。这也是它在bug报告中所说的。如果你不再认为我错了,你应该删除这样说的评论。
    -Xms1024m -Xmx2500m -XX:+PrintFlagsFinal
    
    "-Djsse.enableSNIExtension=false" "your classes ..." -Xms1024m -Xmx2500m -XX:+PrintFlagsFinal