试图从 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 文档的主要内容,如果未能解决你的问题,请参考以下文章