gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:22:28 24 4
gpt4 key购买 nike

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

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 

Java binding Exception: Already connected

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

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

最佳答案

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

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

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

作为解决方法,他们建议设置 jsse.enableSNIExtension 属性。要让您的程序无需重新编译即可运行,请按以下方式运行您的应用程序:

"-Djsse.enableSNIExtension=false"

此信息来源here .

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

System.setProperty("jsse.enableSNIExtension", "false");

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

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

为此,在 Eclipse 中,转到“运行”>“运行配置...”> 选择客户端类>“参数”>“VM 参数”:

-Xms1024m -Xmx2500m -XX:+PrintFlagsFinal

我自己用来解决该问题的来源:source 1 , source 2 , source 3 .

关于启用 chunkedTransferMode,我不需要这样做,因为我在 jersey-client 的文档中发现 jersey-client V2.13 中默认启用了 chunkedTransferMode。

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

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

关于java - 如何使用jersey-client V2.13(从客户端到服务器)在JAVA中上传750MB的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com