我在 Azure 存储上存储了一个文件,需要从 ASP.NET MVC Controller 下载该文件。下面的代码实际上工作得很好。
string fullPath = ConfigurationManager.AppSettings["pdfStorage"].ToString() + fileName ;
Response.Redirect(fullPath);
但是,PDF 会在同一页面中打开。我希望通过“保存”对话框下载文件,以便用户停留在同一页面上。在迁移到 Azure 之前,我可以写
return File(fullPath, "application/pdf", file);
但是对于 Azure 来说这是行不通的。
最佳答案
假设当您说Azure存储
时,您指的是Azure Blob存储
,还有另外两种方法无需实际将文件从存储下载到您的Web服务器,并且这两种方法都涉及设置Content-Disposition
你的 blob 上的属性。
如果您希望通过 URL 访问时文件始终下载,则可以设置 blob 的 content-disposition 属性。
var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); var blobClient = account.CreateCloudBlobClient(); var container = blobClient.GetContainerReference("container-name"); var blob = container.GetBlockBlobReference("somefile.pdf"); blob.FetchAttributes(); blob.Properties.ContentDisposition = "attachment; filename=\"somefile.pdf\""; blob.SetProperties();
但是,如果您希望有时下载文件,有时在浏览器中显示,则可以创建共享访问签名并覆盖 SAS 中的内容处置属性并使用用于下载的 SAS URL。
var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); var blobClient = account.CreateCloudBlobClient(); var container = blobClient.GetContainerReference("container-name"); var blob = container.GetBlockBlobReference("somefile.pdf"); var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy() { Permissions = SharedAccessBlobPermissions.Read, SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(15), }, new SharedAccessBlobHeaders() { ContentDisposition = "attachment; filename=\"somefile.pdf\"", }); var downloadUrl = string.Format("{0}{1}", blob.Uri.AbsoluteUri, sasToken);//This URL will always do force download.
关于c# - 如何通过保存对话框在 ASP.NET MVC 中从 Azure 下载 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31394219/