c# - 如何通过保存对话框在 ASP.NET MVC 中从 Azure 下载 PDF 文件

标签 c# asp.net asp.net-mvc azure azure-storage

我在 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 上的属性。

  1. 如果您希望通过 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();
    
  2. 但是,如果您希望有时下载文件,有时在浏览器中显示,则可以创建共享访问签名并覆盖 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/

相关文章:

c# - HttpWebRequest 虚拟按钮点击

javascript - 每当 UpdatePanel 刷新时运行 javascript

c# - 路由被映射到不同路由的参数

c# - EpiServer:将字符串转换为 XHTMLString

c# - C# 中 System.Net 的 Webclient 无法连接到服务器

c# - 如何将依赖项名称作为构造函数参数注入(inject)

c# - 在 ASP .NET 5 中默认阻止匿名访问

c# - 在 response.redirect 之前调用 javascript

c# - ASP.NET 等效于此 cURL 命令

c# - 这个静态字典字段线程安全吗?