簡體   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