如何使用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