Download multiple PDF Report as Zip using ZipAchive in ASP.Net MVC

Last Reply one year ago By bigbear

Posted one year ago

So I currently have all my PDF records being put in a zip file.

Each record that is selected is put into a single zip.

When I create a Zip and I have multiple records in it each record is the same. Even when I pick different records and the byte[]s are different.

it either picks the very last one or the first one and each file name is of the correct record but the data inside the file each one is the exact same.

Controller

public class HomeController : Controller
{
    // GET: /Home/Export
    public ActionResult Index()
    {
        return View();
    }
 
    [HttpPost]
    public ActionResult Export(string[] quoteIDs)
    {
        List<byte[]> bytesArray = new List<byte[]>();
        List<string> fileNameArray = new List<string>();
        NorthwindEntities entities = new NorthwindEntities();
        if (quoteIDs != null)
        {
            string reportType = "PDF";
            string mimeType = "", encoding = "", fileNameExtension = "";
            foreach (var qid in quoteIDs)
            {
                List<Customer> lstCustomers = new List<Customer>();
                var quote = entities.Customers.Where(x => x.CustomerID == qid).FirstOrDefault();
                lstCustomers.Add(quote);
 
                LocalReport localReport = new LocalReport()
                {
                    ReportPath = Server.MapPath("~/CustomerReport.rdlc")
                };
                ReportDataSource rds = new ReportDataSource("Customers", lstCustomers);
                localReport.DataSources.Add(rds);
 
                string deviceInfo =
                                "<DeviceInfo>" +
                                "   <OutputFormat>" + reportType + "</OutputFormat>" +
                                "   <PageWidth>8.5in</PageWidth>" +
                                "   <PageHeight>11in</PageHeight>" +
                                "   <MarginTop>0.5in</MarginTop>" +
                                "   <MarginLeft>0in</MarginLeft>" +
                                "   <MarginRight>0in</MarginRight>" +
                                "   <MarginBottom>0in</MarginBottom>" +
                                "</DeviceInfo>";
 
                Warning[] warnings;
                string[] streams;
                byte[] renderedBytes = localReport.Render(reportType, deviceInfo, out mimeType, out encoding,
                                                            out fileNameExtension, out streams, out warnings);
                bytesArray.Add(renderedBytes);
                fileNameArray.Add(qid + "." + fileNameExtension);
            }
            TempData["Data"] = bytesArray;
            TempData["File"] = fileNameArray;
            return new JsonResult() { Data = new { MimeType = mimeType } };
        }
 
        return RedirectToAction("VirtualService");
    }
 
    [HttpGet]
    public virtual ActionResult DownloadReportZip(string mimeType)
    {
           byte[] bytearray = null;
 
           if(TempData["Data"] != null)
           {
               List<byte[]> lstBytesArray = TempData["Data"] as List<byte[]>;
               List<string> lstNamesArray = TempData["File"] as List<string>;
 
               using(MemoryStream ms = new MemoryStream())
               {
                   // Creates the .zip
                   using(ZipArchive archive = new ZipArchive(ms, ZipArchiveMode.Create))
                   {
                       int i = 0;
                       foreach(byte[] bytes in lstBytesArray)  // iterate through each file
                       {
                           // Creates empty file and names it inside of .zip
                           ZipArchiveEntry zipItem = archive.CreateEntry(lstNamesArray[i] + ".pdf");
                           // adds file to zipItem
                           using (MemoryStream ms4file = new MemoryStream(bytes))
                           {
                               using(Stream stream = zipItem.Open())
                               {
                                   ms4file.CopyTo(stream);
                               }
                           }
                       }
                   }
                bytearray = ms.ToArray();
            }               
        }
        else
        {
            return new EmptyResult();
        }
           
        return File(bytearray, "application/zip");
    }
}

 

This question does not have replies that have been liked.