如何为 BlobContainerClient 设置 dfs insted blob 端点

Posted

技术标签:

【中文标题】如何为 BlobContainerClient 设置 dfs insted blob 端点【英文标题】:how setup dfs insted blob endpoint for BlobContainerClient 【发布时间】:2021-12-10 16:00:59 【问题描述】:

一般来说,我需要使用 java 创建一个应用程序,该应用程序将在 azure storage 上执行一些操作 比如上传文件,附加到文件,重命名,检查是否存在等等。重要的是它必须与 DFS 端点 https://xxxx.dfs.core.windows 进行通信..

但是我遇到了一些问题:

    在使用 BlobContainerClient 并将文件上传到 Azure 存储期间出现错误:

com.azure.storage.blob.models.BlobStorageException:状态码 400, ""error":"code":"MissingRequiredHeader","message":"一个 HTTP 标头 对于此请求,这是强制性的 指定。\nRequestId:b225d695-201f-00ed-212e-c7c9e8000000\nTime:2021-10-22T10:23:12.4983407Z""

如何避免这种情况,需要什么标头以及如何设置?

    之后我实现了类似的东西,但使用 DataLakeFileSystemClient,这次上传文件完全没问题。不幸的是,并非所有操作都可以执行。例如exists() 方法内部使用 BlobContainerClient 并通过 blob 端点 https://xxxx.blob.core.windows 执行调用。如果在我的情况下被禁止怎么办。 IMO 这是因为 BlobContainerClientBuilder.endpoint(String endpoint) 设置了端点 blobContainerClient 端点到 blob,以及 DataLakeFileSystemClient 的 dfs 端点。 源代码:

    public DataLakeFileSystemClientBuilder endpoint(String endpoint) // 确保提供的端点是 dfs 端点 endpoint = DataLakeImplUtils.endpointToDesiredEndpoint(endpoint, "dfs", "blob"); blobContainerClientBuilder.endpoint(DataLakeImplUtils.endpointToDesiredEndpoint(endpoint, "blob", "dfs"));

所以问题是:它是 BlobContainerClientBuilder.endpoint(String endpoint) 中的错误吗? 或如何解决此问题以对两个客户端使用相同的端点。 目前,我已经实现了 wcomunicatend 我正在使用两个客户端:DataLakeFileSystemClient 来执行操作 像上传,追加等和 BlobContainerClient 来检查文件是否存在。我只想使用其中一个客户端。

你能帮我吗?

【问题讨论】:

【参考方案1】:

Azure Blob 存储是为存储大量非结构化数据而开发的。并且非结构化数据不遵循特定的数据模型或定义,例如文本或二进制数据。

Blob Storage 提供三种资源,分别是 Storage Account (SA)、Container inside SA 和 Blob in the Container。我们使用一些 Java 类来与这些资源进行交互。

BlobContainerClient 类允许您操作 Azure 存储容器及其 ​​Blob。该类主要用于操作或处理Containers(文件系统)。因此,如果您希望处理或操作 Blob(文件),建议使用 BlobClient

检查以下sn-ps创建容器并上传文件。

    使用BlobContainerClient 创建一个容器。

    blobContainerClient.create();
    

    使用从BlobContainerClient 生成的BlobClientBinaryData 上传到blob。

    BlobClient blobClient = blobContainerClient.getBlobClient("myblockblob"); 
    String dataSample = "samples";
    blobClient.upload(BinaryData.fromString(dataSample));
    

要重命名 blob(文件),复制和删除是重命名 blob 的唯一方法。如果您想对较大的 blob 执行此操作,则需要使用异步副本并定期检查其是否完成。

查看此Manage blobs with Java v12 SDK 和Azure Storage Blob client library for Java 文档了解更多信息。

【讨论】:

以上是关于如何为 BlobContainerClient 设置 dfs insted blob 端点的主要内容,如果未能解决你的问题,请参考以下文章

如何为众筹门户设置贝宝

如何为所有 MUI 组件全局禁用 box-shadow?

django:DetailView 如何为两个模型工作或基于类的视图如何为两个模型工作?

如何为@Valid 指定验证组?

如何为下拉菜单制作 CSS 边框?

如何为 CAShapeLayer 路径和填充颜色设置动画