【问题标题】:Azure download blob SAS - confirm pleaseAzure 下载 blob SAS - 请确认
【发布时间】:2015-05-31 12:17:02
【问题描述】:

我想确认我的代码,看看我是否在正确的道路上..

在我看来,我列出了属于该用户的所有 Blob。 用户可以单击其中一个 blob 并立即开始直接从 blob 存储本身下载它。

这里是视图:

@model IEnumerable<Delamapp.CloudStorageServices.UploadEntity>

@foreach (var file in Model)
{
<a href='@Url.Action("DownloadFileTest", "Folder", new { blobName = file.BlobName,        fileName = file.FileName, fileExtension = file.FileExtension })'

@file.FileName.PreviewString(file.FileName, file.FileExtension)@file.FileExtension
}

这里是下载功能:

   public void DownloadFileTest(string blobName, string fileName, string fileExtension)
    {
       //Get SAS url
        CloudBlobContainer blobContainer = CloudStorageServices.GetCloudBlobsContainer();
        CloudBlockBlob blob = blobContainer.GetBlockBlobReference(blobName);

        var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
        {
            SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
            SharedAccessExpiryTime = DateTime.UtcNow.AddHours(3),
            Permissions = SharedAccessBlobPermissions.Read
        });

        string blobSasUri = (string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas));

        //Download Blob through SAS url
        CloudBlockBlob blobSas = new CloudBlockBlob(new Uri(blobSasUri));
        using (MemoryStream ms = new MemoryStream())
        {
            blobSas.DownloadToStream(ms);
            byte[] data = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(data, 0, data.Length);

            Response.ContentType = blobSas.Properties.ContentType;
            Response.AddHeader("Content-Disposition", "Attachment; filename=" + fileName + fileExtension);
            Response.AddHeader("Content-Length", (blobSas.Properties.Length).ToString());
            Response.BinaryWrite(ms.ToArray());
            Response.End();
        }
    }
  1. 我现在是直接从 blob 存储下载吗?
  2. 在 using (MemoryStream ms = new MemoryStream()) 中,这段代码有什么作用?我在使用不需要的东西吗?我应该使用这些吗? Ms.position、response..等
  3. 下载方法是公开的,这意味着它可以从 url 调用。如果我想防止这种情况,我可以在开始时使用 linq 方法并检查用户尝试下载的 blob 是否在他/她的帐户中?够了吗?
  4. 我希望用户能够随时下载自己的 Blob。那么就不需要设置开始时间/结束时间了,对吧?我可以删除那些行吗?

更新

更新存储客户端库后,开始出现以下错误。

发现冲突 -----

  1>C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1635,5): warning MSB3247: Found conflicts between different versions of the same dependent assembly. In Visual Studio, double-click this warning (or select it and press Enter) to fix the conflicts; otherwise, add the following binding redirects to the "runtime" node in the application configuration file: <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="Microsoft.Data.Edm" culture="neutral" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-5.6.1.0" newVersion="5.6.1.0" /></dependentAssembly></assemblyBinding><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="Microsoft.Data.Services.Client" culture="neutral" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-5.6.1.0" newVersion="5.6.1.0" /></dependentAssembly></assemblyBinding><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="System.Spatial" culture="neutral" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-5.6.1.0" newVersion="5.6.1.0" /></dependentAssembly></assemblyBinding><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="Microsoft.Data.OData" culture="neutral" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-5.6.1.0" newVersion="5.6.1.0" /></dependentAssembly></assemblyBinding>

【问题讨论】:

    标签: azure


    【解决方案1】:

    我现在是直接从 blob 存储下载吗?

    没有。您在服务器上运行的代码正在下载 blob,然后服务器将代码流式传输回您的客户端。要直接从 blob 存储下载,请替换以下代码行:

    // Download Blob through SAS url
    CloudBlockBlob blobSas = new CloudBlockBlob(new Uri(blobSasUri));
    using (MemoryStream ms = new MemoryStream())
    {
        blobSas.DownloadToStream(ms);
        byte[] data = new byte[ms.Length];
        ms.Position = 0;
        ms.Read(data, 0, data.Length);
        Response.ContentType = blobSas.Properties.ContentType;
        Response.AddHeader("Content-Disposition", "Attachment; filename=" + fileName + fileExtension);
        Response.AddHeader("Content-Length", (blobSas.Properties.Length).ToString());
        Response.BinaryWrite(ms.ToArray());
        Response.End();
    }
    

    // Download Blob through SAS url
    Redirect(blobSasUri);
    

    在使用 (MemoryStream ms = new MemoryStream()) 中,什么 这段代码呢?我在使用不需要的东西吗?我可以做 使用这些? Ms.position,response..等

    我认为代码很好。

    下载方法是公开的,这意味着它可以从 url 调用。 如果我想防止这种情况,我可以在开始时使用 linq 方法吗? 检查用户尝试下载的 blob 是否在他/她的 帐户?够了吗?

    在不知道更多细节的情况下,我认为这个问题无法回答。

    我希望用户能够随时下载自己的 Blob。 那么就不需要设置开始时间/结束时间了,对吧?我可以删除吗 那些台词?

    你可以。但不建议这样做。归根结底,SAS URL 是一个 URL,您的用户可能会与不应该下载图像的其他人共享。通过在 SAS URL 中保留到期日期,您可以防止 URL 被滥用。

    【讨论】:

    • 啊哈,现在我明白了,哈哈,尴尬。我现在可以下载 blob,但我正在努力使用 new SharedAccessBlobHeaders() { ContentDisposition = "attachment; filename=file-name" });您从哪里获得 SharedAccessBlobHeaders?目前它说在命名空间中找不到它。另外,我不需要设置 ContentType 等吗?
    • 您需要使用存储客户端库版本 3.0+。您可以从此处使用 Nuget 下载/安装:nuget.org/packages/WindowsAzure.Storage。设置内容处置后,您无需担心内容类型。该文件将自动下载。
    • 有什么方法可以在不从 2.0.4 更新到 4.0 的情况下进行设置?我现在在我的项目中遇到各种错误。附加信息:无法加载文件或程序集'Microsoft.Data.Services.Client,Version=5.6.0.0,Culture=neutral,PublicKeyToken=31bf385ad364e35'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
    • 不要更新到 4.0。而是尝试更新到版本 3.x.x (nuget.org/packages/WindowsAzure.Storage/3.2.1)。您可能仍然会收到此错误,在这种情况下,请查看此处:stackoverflow.com/questions/20457846/…。 HTH。
    • 我已经尝试了所有 3.x 没有人的作品。我还重新安装了 dataserviceclient 但这也没有帮助。看看我上面的错误信息,(编辑了我的问题)当我在安装你说的所有项目后构建我的解决方案时出现。我仍然可以运行它,但它在 linq 问题上失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2021-11-13
    • 2017-04-08
    • 2019-09-11
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多