MVCRazorToPDF保存PDF到位置或斑点,然后下载

问题描述:

下面是我的代码:MVCRazorToPDF保存PDF到位置或斑点,然后下载

public class ActionDownloadAttribute : ActionFilterAttribute 
{ 
     public override void OnResultExecuted(ResultExecutedContext filterContext) 
     { 
      filterContext.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + "Report.pdf"); 
      base.OnResultExecuted(filterContext); 
     } 
} 


[ActionDownload] 
public ActionResult GeneratePdf() 
{ 
     List<Comment> comments = null; 
     using (var db = new CandidateEntities()) 
     { 
      comments = db.Comments.ToList(); 
     } 
     return new PdfActionResult("GeneratePdf", comments); 
} 

这上面的代码提供download.But PDF文件我想之前保存它(自动),以特定的路径或BLOB下载它。

任何人都可以帮助我一样吗?

当我最初看到自己的答案时,并没有真正带来很多价值。所以我会尽量扩大。

不是异步

首先,我拥有与您完全相同的控制器。然后我用restsharp拨打电话到该网址

 var client = new RestClient("http://some.url.com"); 

     var request = new RestRequest("mvc/GeneratePDF", Method.GET); 
     // execute the request 
     RestResponse response = (RestResponse)client.Execute(request); 

     // Zwracamy byte[] ktory jest naszym plikiem PDF 
     return response; 

现在,如果你看一下response.RawBytes您可以使用下面的方法来将字节数组直接上传到Azure的:)

我打电话给我的两种方法之一,要么上传一个字节[]或流

public static class AzureStorage 
{ 
    /// <summary> 
    /// Metoda zajmujaca sie uploadem do Azure 
    /// </summary> 
    public static string _uploadToAzureBlob(byte[] arrPDF, string azureContainer, string filename) 
    { 
     // Retrieve connection string 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConn")); 
     // Create blob client 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
     // Retrieve reference to a previously created container. 
     CloudBlobContainer container = blobClient.GetContainerReference(azureContainer); 
     // Create object blob 
     CloudBlockBlob blob = container.GetBlockBlobReference(filename); 
     // Upload 
     blob.UploadFromByteArray(arrPDF, 0, arrPDF.Length); 

     return blob.Uri.ToString(); 
    } 

    /// <summary> 
    /// Metoda zajmujaca sie uploadem do Azure 
    /// </summary> 
    public static string _uploadToAzureBlob(Stream iostream, string azureContainer, string filename, bool ApplyReadPermissions = true) 
    { 
     // Retrieve connection string 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConn")); 
     // Create blob client 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
     // Retrieve reference to a previously created container. 
     CloudBlobContainer container = blobClient.GetContainerReference(azureContainer); 

     // Create container if it does not exist 
     container.CreateIfNotExists(); 

     // Create object blob 
     CloudBlockBlob blob = container.GetBlockBlobReference(filename); 

     iostream.Position = 0;//Move the pointer to the start of stream.. 

     using (var fileStream = iostream) 
     { 
      blob.UploadFromStream(fileStream); 
     } 

     // Here we need to share the URL for reading the barcode! Otherwise we dont have access to it 
     if (ApplyReadPermissions) 
     { 
      var builder = new UriBuilder(blob.Uri); 
      builder.Query = blob.GetSharedAccessSignature(
       new SharedAccessBlobPolicy 
       { 
        Permissions = SharedAccessBlobPermissions.Read, 
        SharedAccessStartTime = new DateTimeOffset(DateTime.UtcNow.AddMinutes(-5)), 
        SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddMinutes(5)) 
       }).TrimStart('?'); 

      var x = builder.Uri.ToString(); 

      return x; 
     } 

     return null; 
    } 
} 

让我知道这是否有帮助。它在我的天蓝色环境中适用于我。我有一个webjob生成这些文件并将它们自动保存在blob上。

更新时间:异步

如果你想重写这些方法上传到Azure的是异步然后有像下面的东西将使你做以下电话:

public async Task<ActionResult> asyncPDF() 
    { 
     return await AzureStorage._uploadToAzureBlob(ControllerContext.GeneratePdf(objModel, "VIEW_NAME")) ; 
    } 

笔者将要测试的是方法更详细地确认其行为。

意见反馈欢迎:D