繁体   English   中英

如何从MVC中的URL下载图像

[英]How to download an image from URL in MVC

在我的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.假设您始终希望下载文件

如果要始终下载文件,可以将Blob的Content-Disposition属性设置为attachment; filename=yourdesiredfilename 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM