[英]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.