2015-07-13 2 views
6

Ich habe eine Datei in Azure-Speicher gespeichert, die ich von ASP.NET MVC-Controller herunterladen muss. Der Code unten funktioniert tatsächlich gut.So laden Sie eine PDF-Datei von Azure in ASP.NET MVC über den Dialog Speichern

string fullPath = ConfigurationManager.AppSettings["pdfStorage"].ToString() + fileName ; 
Response.Redirect(fullPath); 

Allerdings wird das PDF auf der gleichen Seite geöffnet. Ich möchte, dass die Datei über ein Dialogfeld "Speichern" heruntergeladen wird, damit der Benutzer auf derselben Seite bleibt. Vor dem Wechsel zu Azure könnte ich schreiben

return File(fullPath, "application/pdf", file); 

Aber mit Azure, das nicht funktioniert.

Antwort

1

Sie können die Datei herunterladen und dann zum Webbrowser drücken, damit der Benutzer speichern kann.

var fileContent = new System.Net.WebClient().DownloadData(fullPath); //byte[] 

return File(fileContent, "application/pdf", "my_file.pdf"); 

Diese besondere overload nimmt ein Byte-Array, einen Inhaltstyp und einen Dateinamen Ziel.

5

Angenommen, Sie bedeuten Azure Blob Storage wenn Sie Azure Storage sagen, gibt es zwei weitere Möglichkeiten, ohne tatsächlich die Datei aus dem Speicher auf Ihren Webserver herunterzuladen und beide beinhalten Content-Disposition Eigenschaft auf Ihrem Blob Einstellung.

  1. Wenn Sie die Datei wollen immer herunterladen, wenn über eine URL zugegriffen wird, können Sie Blobs Content-Disposition-Eigenschaft festgelegt.

    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. Allerdings, wenn Sie die -Datei heruntergeladen werden sollen manchmal und im Browser anderes Mal angezeigt, können Sie einen gemeinsamen Zugriff Signatur erstellen und die Content-Disposition-Eigenschaft in der SAS außer Kraft setzen und verwenden, die SAS-URL zum Herunterladen.

    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.