在我的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);
}
但是文件没有下载,而是在新窗口中打开,请指导我下载文件而不是在新窗口中打开。
答案 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。