首页 > 解决方案 > 如何将 AppendBlob/大于 4mb 限制的文件上传到 Java 中的 Azure 存储/Blob?

问题描述

如何使用适用于 Java 的 Azure 存储 Blob 客户端库将大(> 4mb)文件作为 AppendBlob 上传?

我已经成功实现了大文件的 BlockBlob 上传,并且似乎该库在内部处理了单个请求的 4mb(?) 限制并将文件分块为多个请求。

然而,该库似乎无法为 AppendBlob 做同样的事情,那么如何手动完成这种分块呢?基本上我认为这需要将 InputStream 分块成更小的批次......

使用 Azure Java SDK 12.14.1

标签: javaazureappendazure-blob-storageazure-storage

解决方案


受 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 存在,如果不存在,则在尝试附加任何数据之前创建它。


推荐阅读