试图从 azure blob 下载 word 文档

Posted

技术标签:

【中文标题】试图从 azure blob 下载 word 文档【英文标题】:trying to download the word document from azure blob 【发布时间】:2020-11-19 13:09:28 【问题描述】:

我正在尝试下载存储在具有私有访问权限的 azure blob 容器中的 word 文档,我需要将下载的文档转换为字节数组,以便能够发送到 react 应用程序

这是我在下面尝试的代码

    [Authorize, HttpGet("id/projectphase?")]
    public async Task<ActionResult<DesignProject>> GetDesignProject(string id, string projectphase = null)
    
          var blobContainerName = Startup.Configuration["AzureStorage:BlobContainerName"];
          var azureStorageConnectionString = Startup.Configuration["AzureStorage:ConnectionString"];

          BlobContainerClient blobContainerClient = new BlobContainerClient(azureStorageConnectionString, blobContainerName);
          blobContainerClient.CreateIfNotExists();
          .......  // not sure how to proceed further 
          .......
          ......
          return new InlineFileContentResult('here i need to return byte array???', "application/docx")  FileDownloadName = fileName ;
    

我得到了存储文件的完整路径名,如下所示

https://xxxx.blob.core.windows.net/design-project-files/99999-99/99999-99-BOD-Concept.docx

然后我也得到了文件名99999-99-BOD-Concept.docx

谁能指导我下一步如何下载文件,非常感谢我。

【问题讨论】:

【参考方案1】:

请尝试以下类似的方法(尽管是未经测试的代码):

public async Task<ActionResult<DesignProject>> GetDesignProject(string id, string projectphase = null)

      var blobContainerName = Startup.Configuration["AzureStorage:BlobContainerName"];
      var azureStorageConnectionString = Startup.Configuration["AzureStorage:ConnectionString"];

      BlobContainerClient blobContainerClient = new BlobContainerClient(azureStorageConnectionString, blobContainerName);
      blobContainerClient.CreateIfNotExists();
      var blobClient = new BlobClient("https://xxxx.blob.core.windows.net/design-project-files/99999-99/99999-99-BOD-Concept.docx");
      var blobName = blobClient.Name;
      blobClient = new BlobClient(azureStorageConnectionString, blobContainerName, blobName);
      using (var ms = new MemoryStream())
      
        await blobClient.DownloadToAsync(ms);
        return new InlineFileContentResult(ms.ToArray(), "application/docx")  FileDownloadName = fileName ;
      

基本上我们所做的是首先使用您拥有的 URL 创建一个BlobClient,以便我们可以从该 URL 中提取 blob 的名称(您也可以进行 URL 解析)。一旦我们有了 blob 的名称,我们就可以使用连接字符串、blob 容器名称和 blob 的名称创建一个新的 BlobClient 实例。

然后我们将 blob 的内容下载为流并将该流转换为字节数组(这部分我不能 100% 确定我的代码是否可以工作)并返回该字节数组。

【讨论】:

【参考方案2】:

你真的不需要在你的 react 应用程序向你的服务器请求这个过程,所以你的服务器会下载文件,然后将它发送到 react 应用程序; Blob 存储中的该文件位于网络上,可从 Blob 存储中下载,因此无需麻烦您的服务器成为它的代理

如果您为 blob 配置公共访问权限,那么您只需将该 URL 放入您的 react 应用程序 - 用户点击它,字节下载。快乐的时光。如果您有私有容器,您仍然可以为 blob 生成 SAS URL

如果您确实需要 React 应用程序中的字节,那么只需使用 javascript Web 请求获取它 - 不过您需要在 blob 容器上设置 CORS 策略


如果您真的想将文件下载到/通过服务器,您可能必须将其流式传输到连接到 react 应用程序的响应流,并传递到下面的 SOMETHING:

        BlobClient blob = blobContainerClient.GetBlobClient( BLOB NAME I.E PATH INSIDE CONTAINER);

        //download to a file or stream
        await blob.DownloadToAsync( SOMETHING );

    

【讨论】:

对不起,我为 blob 配置了私有访问权限,请您指导我如何下载文件的步骤 那么您可以创建一个短暂的共享访问签名吗? 我也创建了那个,之后我陷入了困境 Er.. 所以您创建了短暂的 SAS,然后无法使用 sas url 下载文件? 我放了一些代码来说明如何将文件下载到服务器

以上是关于试图从 azure blob 下载 word 文档的主要内容,如果未能解决你的问题,请参考以下文章

如何使用条件从 Azure 存储下载 blob?

Azure 从 Blob 存储中抓取数据 w。 Python(无需下载)

将 word 文档上传到 Azure 存储时出错

导航到 url 时始终下载 Azure Blob

如何从 azure blob 存储下载文件

从 Azure Blob C# 下载图像