【问题标题】:trying to download the word document from azure blob试图从 azure blob 下载 word 文档
【发布时间】: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

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

【问题讨论】:

    标签: c# .net azure blob azure-blob-storage


    【解决方案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 下载文件?
      • 我放了一些代码来说明如何将文件下载到服务器
      猜你喜欢
      • 2019-05-29
      • 2019-04-06
      • 2017-08-20
      • 2021-12-12
      • 1970-01-01
      • 2013-04-16
      • 2021-01-04
      • 2018-08-03
      相关资源
      最近更新 更多