我正在使用泽西客户端进行基于超文本传输协议的请求。如果文件很小,它会很好地工作,但当我发布大小为700M的文件时会出错:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:61)
at com.sun.jersey.api.client.CommittingOutputStream.write(CommittingOutputStream.java:90)
at com.sun.jersey.core.util.ReaderWriter.writeTo(ReaderWriter.java:115)
at com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider.writeTo(AbstractMessageReaderWriterProvider.java:76)
at com.sun.jersey.core.impl.provider.entity.FileProvider.writeTo(FileProvider.java:103)
at com.sun.jersey.core.impl.provider.entity.FileProvider.writeTo(FileProvider.java:64)
at com.sun.jersey.multipart.impl.MultiPartWriter.writeTo(MultiPartWriter.java:224)
at com.sun.jersey.multipart.impl.MultiPartWriter.writeTo(MultiPartWriter.java:71)
at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:300)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:568)
at TestHttpRequest.main(TestHttpRequest.java:42)
这是我的代码:
ClientConfig cc = new DefaultClientConfig();
Client client = Client.create(cc);
WebResource resource = client.resource("http://localhost:8080/JerseyWithServletTest/helloworld");
FormDataMultiPart form = new FormDataMultiPart();
File file = new File("E:/CN_WXPPSP3_v312.ISO");
form.field("username", "ljy");
form.field("password", "password");
form.field("filename", file.getName());
form.bodyPart(new FileDataBodyPart("file", file, MediaType.MULTIPART_FORM_DATA_TYPE));
ClientResponse response = resource.type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
下面是使用Jersey 2.11上载具有分块传输编码(即流)的(可能较大)文件的代码。
Maven公司:
<properties>
<jersey.version>2.11</jersey.version>
</properties>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependencies>
Java:
Client client = ClientBuilder.newClient(clientConfig);
client.property(ClientProperties.REQUEST_ENTITY_PROCESSING, "CHUNKED");
WebTarget target = client.target(SERVICE_URI);
InputStream fileInStream = new FileInputStream(inFile);
String contentDisposition = "attachment; filename=\"" + inFile.getName() + "\"";
System.out.println("sending: " + inFile.length() + " bytes...");
Response response = target
.request(MediaType.APPLICATION_OCTET_STREAM_TYPE)
.header("Content-Disposition", contentDisposition)
.header("Content-Length", (int) inFile.length())
.put(Entity.entity(fileInStream, MediaType.APPLICATION_OCTET_STREAM_TYPE));
System.out.println("Response status: " + response.getStatus());
为了使您的代码不依赖于上传文件的大小,您需要:
服务器:
@POST
@Path("/upload/{attachmentName}")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public void uploadAttachment(@PathParam("attachmentName") String attachmentName, InputStream attachmentInputStream) {
// do something with the input stream
}
客户:
...
client.setChunkedEncodingSize(1024);
WebResource rootResource = client.resource("your-server-base-url");
File file = new File("your-file-path");
InputStream fileInStream = new FileInputStream(file);
String contentDisposition = "attachment; filename=\"" + file.getName() + "\"";
ClientResponse response = rootResource.path("attachment").path("upload").path("your-file-name")
.type(MediaType.APPLICATION_OCTET_STREAM).header("Content-Disposition", contentDisposition)
.post(ClientResponse.class, fileInStream);
您可以使用流。在客户端上尝试以下操作:
InputStream fileInStream = new FileInputStream(fileName);
String sContentDisposition = "attachment; filename=\"" + fileName.getName()+"\"";
WebResource fileResource = a_client.resource(a_sUrl);
ClientResponse response = fileResource.type(MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", sContentDisposition)
.post(ClientResponse.class, fileInStream);
服务器上有这样的资源:
@PUT
@Consumes("application/octet-stream")
public Response putFile(@Context HttpServletRequest a_request,
@PathParam("fileId") long a_fileId,
InputStream a_fileInputStream) throws Throwable
{
// Do something with a_fileInputStream
// etc
我使用的是Jersey 2.28,想要编写一个客户端来上传1Gb的文件,而客户端JVM堆不能超过256Mb。 我在这里有什么选择? 我试着用下面的代码片段,但结果是OOM,因为Jersey似乎一直在尽可能多地从InputStream中读取数据。为了处理大量输入,可以指示球衣进行冲洗吗?
我得到以下错误: PHP致命错误:在vendor/Google/apiclient/src/Google/Http/REST.PHP:118中出现未捕获的异常“Google\u Service\u exception”,消息为“未能解析内容范围头” 堆栈跟踪: 0供应商/google/apiclient/src/Google/Http/REST. php(94):Google_Http_REST:
问题内容: 我目前正在实现使用jersey rest上传文件的功能。我想设置一个允许的最大文件大小,这对我来说似乎是很常见的要求。 我的第一种方法是使用Jerseys FormDataContentDisposition,它应该包含我可能需要的有关文件的所有信息。但是似乎缺少所有信息,除了文件名,包括文件大小。 这是我的休息方法: 由于返回的大小始终为“ -1”,因此不起作用! 我使用一个非常简单
问题内容: 我正在尝试创建一个文件下载程序作为后台服务,但是当计划了一个大文件时,首先将其放入内存中,然后在下载结束时将文件写入磁盘。 考虑到我可能同时下载许多文件,如何使文件逐渐写入磁盘保留内存? 这是我使用的代码: 问题答案: 我将回调更改为: 这工作得很好。
以下是AWS Amplify GraphQL客户端的官方文档:https://aws-amplify.github.io/amplify-js/media/api_guide.html.本节提供了基本输入的示例。 对于AWS Mobile Appsync SDK For Javascript,这里有一个详细的文档:https://docs.aws.amazon.com/appsync/latest
问题内容: 如何使用Jersey客户端API将GET请求发送到运行HTTPS协议的服务器。我可以使用任何示例代码吗? 问题答案: 这样构建您的客户 从此博客文章中窃取了更多详细信息:http : //blogs.oracle.com/enterprisetechtips/entry/consumption_restful_web_services_with 有关设置证书的信息,请参见以下已很好回答