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