Java 将非常大的文件上载到Swift容器
我正在使用jclouds java SDK上传到Swift容器中,我看到了作为多部分上传的代码,我已经使用代码作为多部分上传作为输入流Java 将非常大的文件上载到Swift容器,java,upload,openstack-swift,jclouds,Java,Upload,Openstack Swift,Jclouds,我正在使用jclouds java SDK上传到Swift容器中,我看到了作为多部分上传的代码,我已经使用代码作为多部分上传作为输入流 try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { ///input here is InputStream not ByteSource Payload payload = P
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
///input here is InputStream not ByteSource
Payload payload = Payloads.newInputStreamPayload(inputStream);
Blob blob = blobStore.blobBuilder(path).payload(payload).build();
///sednig the request
blobStore.putBlob(ContainerName, blob, multipart());
System.out.println(String.format("End upload all Parts, parts number=%s, part size=%s", strPartsCount, strPartSize));
}
但是我有一个例子,我有一个非常大的文件,它的输入是一个字节矩阵,解决方法很简单,就是把相同的代码放在一个for循环中,每个循环的输入是矩阵的索引(这是一个字节数组)
但是问题是,OpenStack会考虑每个循环(多个部分上传)链接到上一个部分吗?怎么做?
您可以在多部分中说多部分
谢谢jclouds提供了两个选项:
1) 调用各个多部分方法,例如,initiateMultipartUpload
,uploadMultipartPart
,和completeMultippartUpload
2) 创建连接各个部分的InputStream
或ByteSource
有效载荷,例如SequenceInputStream
或ByteSource.concat
请注意,使用ByteSource.wrap(bytes)
而不是ByteArrayInputStream(bytes)
会使负载可重复,jclouds将在网络错误时重试。jclouds提供两个选项:
1) 调用各个多部分方法,例如,initiateMultipartUpload
,uploadMultipartPart
,和completeMultippartUpload
2) 创建连接各个部分的InputStream
或ByteSource
有效载荷,例如SequenceInputStream
或ByteSource.concat
请注意,使用ByteSource.wrap(bytes)
而不是ByteArrayInputStream(bytes)
会使有效负载可重复,jclouds会在网络错误时重试。非常感谢,还有一个问题,您提到的两种方法中的任何一种都比另一种有优势吗?因为大多数多部分上传案例我都使用第二种方法,或者jclouds示例中提到的方法。您应该更喜欢第二种方法,因为它可以处理最小零件尺寸和其他杂物。我相信如果出现网络错误或任何其他错误,它也会得到处理,对吗?如果您提供像ByteSource这样的可重复负载,jclouds将处理网络错误。非常感谢,还有一个问题,您提到的两种方法中的任何一种都比另一种有优势吗?因为大多数多部分上传案例我都使用第二种方法,或者jclouds示例中提到的方法。您应该更喜欢第二种方法,因为它可以处理最小零件尺寸和其他杂物。我相信如果出现网络错误或任何其他错误,它也会得到处理,对吗?如果您提供像ByteSource这样的可重复负载,jclouds将处理网络错误。