REST API:InputStream 复制(吻合)大文件失败
REST API: InputStream Copying (dovetailing) Failing for Big Files
我正在使用 Jersey 1.8 开发 REST API 来上传文件。反过来,我使用服务提供商 REST API 将文件上传到他们的站点。流程如下所示:
浏览器 --> 我的 REST 使用 Jersey 服务器端;然后使用 Apache HTTP 客户端进行后续 REST 调用 --> 服务提供商的 REST。
当我上传小文件 (<1MB) 时,一切正常。但是当文件大小增加时,它会给我以下错误。
A JSONObject text must begin with '{' at character 0
我怀疑错误是由于流 "cut" 中途造成的。以下代码片段有什么问题(我已经删除了不相关的代码)。
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response uploadDocument(@FormDataParam("document") InputStream inputStream) {
FilenetAdapter filenet = new FilenetAdapter();
String documentId = filenet.uploadDocument(inputStream);
// return the Jersey call - code removed for bravity
}
//FilenetAdapert.uploadDocument function
public String uploadDocument(InputStream inputStream) {
HttpPost request = new HttpPost(serviceUrl);
request.setEntity(buildMultipartEntity(metadata, inputStream));
CloseableHttpClient client = HttpClientBuilder.create().build();
CloseableHttpResponse response = client.execute(request);
//consume the response - code removed for bravity
}
private HttpEntity buildMultipartEntity(JSONObject metadata, InputStream inputStream)
throws IOException, URISyntaxException, JSONException {
// Build a multipart HTTP request according to RFC1341
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// Set request metadata
StringBody stringBody = new StringBody(metadata.toString(), ContentType.TEXT_PLAIN);
FormBodyPartBuilder bodyPartBuilder = FormBodyPartBuilder.create();
bodyPartBuilder.setName("metadata");
bodyPartBuilder.setBody(stringBody);
FormBodyPart mdata = bodyPartBuilder.build();
builder.addPart(mdata);
// Set request content
ContentBody cbFile = new InputStreamBody(inputStream, ContentType.APPLICATION_OCTET_STREAM);
builder.addPart("file", cbFile);
return builder.build();
}
服务提供商更改了他们的服务器配置。这解决了问题。
我正在使用 Jersey 1.8 开发 REST API 来上传文件。反过来,我使用服务提供商 REST API 将文件上传到他们的站点。流程如下所示:
浏览器 --> 我的 REST 使用 Jersey 服务器端;然后使用 Apache HTTP 客户端进行后续 REST 调用 --> 服务提供商的 REST。
当我上传小文件 (<1MB) 时,一切正常。但是当文件大小增加时,它会给我以下错误。
A JSONObject text must begin with '{' at character 0
我怀疑错误是由于流 "cut" 中途造成的。以下代码片段有什么问题(我已经删除了不相关的代码)。
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response uploadDocument(@FormDataParam("document") InputStream inputStream) {
FilenetAdapter filenet = new FilenetAdapter();
String documentId = filenet.uploadDocument(inputStream);
// return the Jersey call - code removed for bravity
}
//FilenetAdapert.uploadDocument function
public String uploadDocument(InputStream inputStream) {
HttpPost request = new HttpPost(serviceUrl);
request.setEntity(buildMultipartEntity(metadata, inputStream));
CloseableHttpClient client = HttpClientBuilder.create().build();
CloseableHttpResponse response = client.execute(request);
//consume the response - code removed for bravity
}
private HttpEntity buildMultipartEntity(JSONObject metadata, InputStream inputStream)
throws IOException, URISyntaxException, JSONException {
// Build a multipart HTTP request according to RFC1341
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// Set request metadata
StringBody stringBody = new StringBody(metadata.toString(), ContentType.TEXT_PLAIN);
FormBodyPartBuilder bodyPartBuilder = FormBodyPartBuilder.create();
bodyPartBuilder.setName("metadata");
bodyPartBuilder.setBody(stringBody);
FormBodyPart mdata = bodyPartBuilder.build();
builder.addPart(mdata);
// Set request content
ContentBody cbFile = new InputStreamBody(inputStream, ContentType.APPLICATION_OCTET_STREAM);
builder.addPart("file", cbFile);
return builder.build();
}
服务提供商更改了他们的服务器配置。这解决了问题。