在c#中以私有访问方式下载Azure存储Blob时出现问题

fruv7luv  于 2023-02-09  发布在  C#
关注(0)|答案(3)|浏览(208)

我在c#方面完全是个菜鸟,对azure apis知之甚少,我现在是一个正在做一个项目的cs学生,我用youtube教程构建了一些中间件,它使用一个字符串连接来验证一个存储帐户,它枚举,上传,下载,并删除容器中的Blob。问题是"我只在下载功能和存储帐户访问权限设置为私有时撒谎。这个功能在匿名访问下工作正常。我怀疑问题出在附加URL上,我不知道如何修复它。如果有问题的话,这些斑点主要是csv数据。任何帮助或资源方向都将非常感谢,这里是相关代码:🙂 here is the relevant code:
url函数

public async Task<string> GetBlob(string name, string containerName)
    {
        var containerClient = _blobClient.GetBlobContainerClient(containerName);
        var blobClient = containerClient.GetBlobClient(name);
        return blobClient.Uri.AbsoluteUri;

    }

配置文件

"AllowedHosts": "*",
  "BlobConnection" : "<mystringconnection>******==;EndpointSuffix=core.windows.net"

动作请求

[HttpGet]
    public async Task<IActionResult> ViewFile(string name)
    {
        var res = await _blobService.GetBlob(name, "<mystorageacc>");
        return Redirect(res);
    }
rqdpfwrv

rqdpfwrv1#

无法从私有容器下载Blob的原因是,您只是从方法返回Blob的URL,而没有任何授权信息。必须授权访问私有容器中的Blob的请求。
您需要做的是创建一个至少具有Read权限的Shared Access Signature (SAS),然后返回该SAS URL。您要使用的方法是GenerateSasUri。您的代码如下所示:

public async Task<string> GetBlob(string name, string containerName)
{
    var containerClient = _blobClient.GetBlobContainerClient(containerName);
    var blobClient = containerClient.GetBlobClient(name);
    return blobClient.GenerateSasUri(BlobSasPermissions.Read, DateTime.UtcNow.AddMinutes(5)).Uri.AbsoluteUri;
}

这将为您提供一个链接,该链接在创建后5分钟内有效,并且具有读取(下载)blob的权限。

u5rb5r59

u5rb5r592#

如果要从blob服务下载;

public async Task<byte[]> ReadFileAsync(string path)
    {
        using var ms = new MemoryStream();
        var blob = _client.GetBlobClient(path);
        await blob.DownloadToAsync(ms);
        return ms.ToArray();
    }

如果你想从控制器下载文件字节数组,你可以选中这个;https://stackoverflow.com/a/3605510/3024129
如果要设置blob文件的公共访问级别;https://learn.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-configure.
请注意画面;

或者,您可以连接**Azure Storage Explorer**,并选择简单的方法。
第一节第一节第一节第二节第一节
我在谷歌上找到的图片,可能会有差异。:)

7fyelxc5

7fyelxc53#

这对我来说是有效的,返回一个字节数组:

byte[] base64ImageRepresentation = new byte[] { };

            BlobClient blobClient = new BlobClient(blobConnectionString, blobContainerUserDocs,+ "/" + fileName);

            if (await blobClient.ExistsAsync())
            {
                using var ms = new MemoryStream();
                await blobClient.DownloadToAsync(ms);
                return ms.ToArray();
            }

相关问题