【问题标题】:How to download an image from URL in MVC如何从 MVC 中的 URL 下载图像
【发布时间】:2014-05-28 15:05:37
【问题描述】:

在我的 Asp.net MVC 中,当图像文件保存在实际文件夹结构中时,我使用了以下代码。

public FileResult DownloadFile(string imageName)
        {
            string fullPath = this.GetFullPath(imageName);
            string contentType = " image/pjpeg";

            return new FilePathResult(fullPath, contentType)
            {
                FileDownloadName = imageName
            };
        }

但是现在我们已经将图像移动到 Azure Blob,我们如何从那里下载图像。由于 FilePathResult dint 工作,我们尝试使用以下代码。

public ActionResult DownloadFile(string imgName)
        {            
            string fullPath = imgName;            
            CloudStorageAccount account = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConString"));
            CloudBlobClient client = account.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = client.GetContainerReference(ConfigurationManager.AppSettings["BlobReference"]);

            CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(imgName);

            return Redirect(blockBlob.Uri.AbsoluteUri);
        }

但是文件没有下载,而是在新窗口中打开,请指导我下载文件而不是在新窗口中打开。

【问题讨论】:

    标签: c# asp.net asp.net-mvc azure download


    【解决方案1】:

    所以有两种方法可以完成这件事:

    1.假设您总是希望下载文件

    如果您希望始终下载文件,可以将 blob 的 Content-Disposition 属性设置为 attachment; filename=yourdesiredfilename。在这种情况下,blockBlob.Uri.AbsoluteUri 将始终强制下载文件。

    2。假设您希望灵活地有时下载文件并在浏览器中打开文件

    在这种情况下,您可以在 blob 上创建共享访问签名 (SAS),并将 Content-Disposition 标头指定为 SAS 的一部分。这是执行此操作的示例代码:

            CloudStorageAccount acc = new CloudStorageAccount(new StorageCredentials("<accountname>", "<accountKey>"), true);
            var client = acc.CreateCloudBlobClient();
            var container = client.GetContainerReference("<containername>");
            var blob = container.GetBlockBlobReference("<imagename.png>");
            var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
                Permissions = SharedAccessBlobPermissions.Read
            }, new SharedAccessBlobHeaders()
            {
                ContentDisposition = "attachment;filename=<imagename.png>",
            });
            var blobUrl = blob.Uri.AbsoluteUri + sasToken;
            Redirect(blobUrl);
    

    我的建议是使用 #2,因为它可以为您提供更高的安全性 + 您还可以从私有 blob 容器共享 blob。

    【讨论】:

    • 亲爱的 Gaurav, 感谢您在 Itry 与我最终得到错误的代码时提供帮助:AuthenticationFailed Server 未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。 RequestId:602cbaa4-c4cc-445b-84aa-b02fd0c5932c 时间:2014-05-28T07:18:51.7078236Z签名不匹配。使用的签名字符串是 r 2014-05-28T08:18:47Z 任何想法,如何解决它
    • 我用最新版本的存储客户端库试过了,效果很好。您是否可以共享代码(显然取出帐户名/密钥和其他敏感信息)?另外请检查您计算机上的时钟是否未关闭。我已经看到这种错误是因为这个或不正确的帐户密钥而出现的。
    • 非常感谢 Gaurav,我替换了行“CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(imgName);”使用“ICloudBlob blockBlob = blobContainer.GetBlobReferenceFromServer(imgName);”它工作正常。
    • 嗯...这很奇怪。我不建议这样做,因为GetBlobReferenceFromServer 实际上调用了存储服务,并且因为它是网络调用,所以它可能会失败。另外,您实际上并不需要这样做来创建 SAS URL。
    • 好的,让我试试之前的代码。不知道是什么问题。
    猜你喜欢
    • 2019-12-24
    • 2014-09-07
    • 1970-01-01
    • 2017-01-31
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多