【问题标题】:MVCRazorToPDF save PDF to location or Blob and then downloadMVCrazorToPDF 将 PDF 保存到位置或 Blob,然后下载
【发布时间】:2014-09-30 13:15:25
【问题描述】:

下面是我的代码:

 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);
 }

上面的代码提供了 PDF 文件供下载。但我想在下载之前将它(自动)保存到特定路径或 Blob。

任何人都可以帮助我吗?

【问题讨论】:

    标签: asp.net-mvc-4 mvcrazortopdf


    【解决方案1】:

    当我最初查看我的答案时,它并没有真正带来很多价值。所以我会尝试扩展。

    非异步

    首先,我拥有与您完全相同的控制器。然后我使用 restsharp 调用那个 URL

            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 :)

    我调用我的 2 种方法之一来上传字节 [] 或从流中上传

     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

    【讨论】:

      【解决方案2】:

      请检查此示例中的方法 SaveToAppData:

      https://github.com/andyhutch77/MvcRazorToPdf/blob/master/MvcRazorToPdfExample/Controllers/PdfController.cs

      它使用 ControllerContext 中的 GeneratePdf 方法来实现:

              byte[] pdfOutput = ControllerContext.GeneratePdf(model, "IndexWithAccessToDocumentAndWriter");
              string fullPath = Server.MapPath("~/App_Data/FreshlyMade.pdf");
      
              if (SysIO.File.Exists(fullPath))
              {
                  SysIO.File.Delete(fullPath);
              }
              SysIO.File.WriteAllBytes(fullPath, pdfOutput);
      

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 2018-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2020-09-21
        • 2021-08-23
        • 1970-01-01
        相关资源
        最近更新 更多