MVCRazorToPDF save PDF to location or Blob and then download

↘锁芯ラ 提交于 2019-12-11 11:27:45

问题


Below is my code :

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

This above code gives the PDF file for download.But I want to Save it(Automatically) to specific path or Blob before downloading it.

Can anyone help me in the same?


回答1:


When I looked originally at my answer it did not really brought a lot of value.So I will try to expand.

Not async

First I have exactly the same controller as you. Then I use restsharp to make a call to that 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;

Now if you look at the response.RawBytes you can use that in methods below to upload the byte array directly to Azure :)

I call one of my 2 methods to either upload a byte[] or from stream

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

Let me know if this helps. It works for me in my azure environment. I have a webjob generating those files and saving them automatically on blob.

Updated : Async

If you would rewrite those methods to upload to Azure to be Async then having something like below would enable you to do following call :

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

I will be testing that method more in detail to confirm its behavior.

comments much welcome :D



来源:https://stackoverflow.com/questions/26121823/mvcrazortopdf-save-pdf-to-location-or-blob-and-then-download

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!