如何将大于 4mb 限制的 AppendBlob/a 文件上传到 Java 中的 Azure Storage/Blob?
How to upload AppendBlob/a file larger than the 4mb limit into Azure Storage/Blob in Java?
如何使用 Azure Storage Blob client library for Java 将大型 (>4mb) 文件上传为 AppendBlob?
我已经成功实现了大文件的 BlockBlob 上传,而且该库似乎在内部处理了单个请求的 4mb(?)限制并将文件分块为多个请求。
然而,该库似乎无法为 AppendBlob 执行相同的操作,那么如何手动完成这种分块?基本上我认为这需要将 InputStream 分成更小的批次......
使用 Azure Java SDK 12.14.1
受以下 SO 中答案的启发(与在 C# 中执行此操作相关):
c-sharp-azure-appendblob-appendblock-adding-a-file-larger-than-the-4mb-limit
...我最终在 Java 中这样做了:
AppendBlobRequestConditions appendBlobRequestConditions = new AppendBlobRequestConditions()
.setLeaseId("myLeaseId");
try (InputStream input = new BufferedInputStream(
new FileInputStream(file));) {
byte[] buf = new byte[AppendBlobClient.MAX_APPEND_BLOCK_BYTES];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
if (bytesRead != buf.length) {
byte[] smallerData = new byte[bytesRead];
smallerData = Arrays.copyOf(buf, bytesRead);
buf = smallerData;
}
try (InputStream byteStream = new ByteArrayInputStream(buf);) {
appendBlobClient
.appendBlockWithResponse(byteStream, bytesRead,
null, appendBlobRequestConditions, null,
null);
}
}
}
当然,在此之前您需要做很多事情,例如确保 AppendBlob 存在,如果不存在,则在尝试附加任何数据之前创建它。
如何使用 Azure Storage Blob client library for Java 将大型 (>4mb) 文件上传为 AppendBlob?
我已经成功实现了大文件的 BlockBlob 上传,而且该库似乎在内部处理了单个请求的 4mb(?)限制并将文件分块为多个请求。
然而,该库似乎无法为 AppendBlob 执行相同的操作,那么如何手动完成这种分块?基本上我认为这需要将 InputStream 分成更小的批次......
使用 Azure Java SDK 12.14.1
受以下 SO 中答案的启发(与在 C# 中执行此操作相关): c-sharp-azure-appendblob-appendblock-adding-a-file-larger-than-the-4mb-limit
...我最终在 Java 中这样做了:
AppendBlobRequestConditions appendBlobRequestConditions = new AppendBlobRequestConditions()
.setLeaseId("myLeaseId");
try (InputStream input = new BufferedInputStream(
new FileInputStream(file));) {
byte[] buf = new byte[AppendBlobClient.MAX_APPEND_BLOCK_BYTES];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
if (bytesRead != buf.length) {
byte[] smallerData = new byte[bytesRead];
smallerData = Arrays.copyOf(buf, bytesRead);
buf = smallerData;
}
try (InputStream byteStream = new ByteArrayInputStream(buf);) {
appendBlobClient
.appendBlockWithResponse(byteStream, bytesRead,
null, appendBlobRequestConditions, null,
null);
}
}
}
当然,在此之前您需要做很多事情,例如确保 AppendBlob 存在,如果不存在,则在尝试附加任何数据之前创建它。