c# - 使用 GetSharedAccessSignature 下载大文件的 Azure

标签 c# asp.net azure download azure-storage

通过网页,我希望允许用户下载存储在 Azure 云存储上的(非常大的)文件。我使用 GetSharedAccessSignature 来允许用户下载它(注意:容器 protected 且不可公开读取)。 我使用以下代码:

// get the file blob
// CloudBlockBlob blob set previously and check (it exists)

        string sas = blob.GetSharedAccessSignature(
            new SharedAccessPolicy() { 
                Permissions = SharedAccessPermissions.Read,
                SharedAccessStartTime = DateTime.Now.AddMinutes(-5),
                SharedAccessExpiryTime = DateTime.Now.AddMinutes(54) 
            });

        Response.Redirect(blob.Attributes.Uri.AbsoluteUri + sas);

除非下载时间超过 1 小时(正如我所说,通过不太好的互联网连接下载非常大的文件......),否则此方法有效。 如果下载时间较长,则会发生超时,并且下载会在共享访问过期时间过后停止。

我该如何解决这个问题?

亲切的问候, 罗比·德萨特

最佳答案

从代码来看,您似乎实际上是让浏览器进行下载。在这种情况下,我认为可以选择让共享访问签名的有效期更长。

另一个想法是让您的代码读取 blob 的 block ,然后传输这些 block 。这样,如果需要,您可以创建一个新的 SAS URI,并在 SAS URI 超时已过期且 Blob 尚未完全下载时使用它。

看看下面的示例代码。基本上在这个示例中,我有一个 200 MB 的 blob。在循环中,我的代码读取 Blob 的 1 MB block 并将该 block 向下发送。

        protected void ButtonDownload_Click(object sender, EventArgs e)
    {
        var blobUri = "http://127.0.0.1:10000/devstoreaccount1/abc/test2.vhd?sr=b&st=2012-08-17T10%3A29%3A46Z&se=2012-08-17T11%3A29%3A46Z&sp=r&sig=dn7cnFhP1xAPIq0gH6klc4nifqgk7jfOgb0hV5Koi4g%3D";
        CloudBlockBlob blockBlob = new CloudBlockBlob(blobUri);
        var blobSize = 200 * 1024 * 1024;
        int blockSize = 1024 * 1024;
        Response.Clear();
        Response.ContentType = "APPLICATION/OCTET-STREAM";
        System.String disHeader = "Attachment; Filename=\"" + blockBlob.Name + "\"";
        Response.AppendHeader("Content-Disposition", disHeader);
        for (long offset = 0; offset < blobSize; offset += blockSize)
        {
            using (var blobStream = blockBlob.OpenRead())
            {
                if ((offset + blockSize) > blobSize)
                    blockSize = (int)(blobSize - offset);
                byte[] buffer = new byte[blockSize];
                blobStream.Read(buffer, 0, buffer.Length);
                Response.BinaryWrite(buffer);
                Response.Flush();
            }
        }
        Response.End();
    }

希望这有帮助。

关于c# - 使用 GetSharedAccessSignature 下载大文件的 Azure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12003790/

相关文章:

c# - 如何在.NET 中调试跨线程异常?

c# - 更新 "live"WPF Canvas (折线),当 PointCollection 发生变化时

ASP.NET Web 服务初始化

javascript - SignalR-Hub在IIS停止、启动后将不再调用客户端函数

c# - 在 Azure Web App 中启动期间使用 AddAzureKeyVault 时出现 SocketException (10060)

c# - 如果我每隔一小时运行 azure WebJob,我会收到印度标准时区延迟 30 分钟的通知

c# - 如何在另一个位置创建数据库而不是默认哺乳 c :\Users\USER in ASP. NET Core 2.2

c# - 将字符串转换为 Int(不解析)

asp.net - AjaxControlToolkit HTMLEditor - 不接受句号按键

azure - 发布页面更改时出现问题