如何从MVC中的URL下载图像

时间:2014-05-28 06:38:53

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

在我的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);
        }

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

1 个答案:

答案 0 :(得分: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。