Search code examples
asp.netajaxposthttphandlerashx

return response back to ajax from ashx handler in c#


In my application i am using one ashx handler for download ppt, In that i will create one screen shot(current screen as image) and pass that image name to one handler(ashx) from jquery. But am unable to track the downloading status.

If there is any way to return response from that handler to jquery. that is i want to know when that downloading will finish.

my current scenario is like this

  1. jquery will generate one base64 string and pass that string to code behind by ajax call to convert that to image and save that image in one location

  2. on the success call of that ajax request it will get that image name and pass that image name to handler

  3. I am calling that handler by using "window.location.href"

my code

Ajax call for saving the image

   $.ajax({
            type: "POST",
            url: AQ.AMT.Url + "/Home/StoreImage",
            //async: false,
            data: "{'base64':'" + base64 + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (Data) {
                window.location.href = "~/Download/Export.ashx?Type=PPT&downloadToken=" + Data.Result + "&Summary=" + summaryText + "&Note=" + noteText + "&Name=" + name + "&Sample=" + sampleSize + "&SampleColor=" + sampleColor + "&pptType=" + pptType + "&flipName=" + flipName;
              //here i need some response
            },
            error: function (e) {
            }
        });

Handler code for downloading the ppt

 public void ProcessRequest(HttpContext context)
    {
        DownloadPPT(context);
    }
 public void DownloadPPT(HttpContext context)
    {
      //here i will take all parameters 
      try{
          //downloading the ppt
          saveFile(pres, "" + name + "-" + FlipName + "-" + System.DateTime.Today.ToLongDateString());//ppt name
         }
        catch{

             }
          finally
            {
            //after ppt download i am deleting that screenshot
            if (File.Exists(path))
                File.Delete(path);

             }  
    }

Solution

  • I got one solution for this,Instead of using handler for downloading the files i used ajax and jquery. in this in code behind i will create the ppt and save the ppt in some folder and i will pass that name to ajax response and use anchor tag to enable the download in client side itself.

    Saving the ppt

     [HttpPost]
        public JsonResult StoreImage(ExportToPPtRequest request)
        {
            ExportPptString obj = new ExportPptString();
            string downloadToken = Guid.NewGuid().ToString();
            string filepath = Server.MapPath("~/Download/Temp/" + downloadToken + ".png");
            try
            {
                using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(request.Base64)))
                {
                    using (System.Drawing.Bitmap bm2 = new System.Drawing.Bitmap(ms))
                    {
                        //bm2.Save(filepath);
    
                        downloadToken = "";
    
                        downloadToken=DownloadPPT(bm2,request);
                       // bm2.Dispose();
                    }
                   // ms.Close();
                }
    
                obj.Result = downloadToken;
    
            }
            catch (Exception ex)
            {
    
            }
            var result = Json(obj, JsonRequestBehavior.AllowGet);
            return result;
        }
    
        public string DownloadPPT(Image imgToReplace, ExportToPPtRequest request)
        {
    
             string summaryText = request.Summary;
             string note = request.Note;
             string sampleSize = request.SampleSize;
             string SampleColor = request.SampleColor;
             string Type = request.Type;
             string name = request.Name;
             string pptName = "";
             try
            {
                //if (downloadToken == string.Empty || downloadToken == null)
                //    throw new Exception("Download Token is unavailable.");
    
                Aspose.Slides.License license = new Aspose.Slides.License();
                license.SetLicense("Aspose.Slides.lic");
                var _tempPPT = "";
                    _tempPPT = Server.MapPath("~/Download/Template/ExportPPt.pptx");
    
                Aspose.Slides.Presentation pres = new Aspose.Slides.Presentation(_tempPPT);
    
    
              pptName= saveFile(pres);//ppt name
    
            }
            catch (Exception ex)
            {
    
            }
    
            return pptName;
    
        }
        public  string saveFile(Aspose.Slides.Presentation pres)
        {
    
            string downloadToken = Guid.NewGuid().ToString();
            try
            {
                //MemoryStream objMemoryStream = new MemoryStream();
                //pres.Save(objMemoryStream, Aspose.Slides.Export.SaveFormat.Pptx);
                pres.Save(Server.MapPath("~/Download/Temp/" + downloadToken + ".pptx"), Aspose.Slides.Export.SaveFormat.Pptx);
                //byte[] buffer = objMemoryStream.ToArray();
                //HttpContext.Current.Response.Clear();
                //HttpContext.Current.Response.Buffer = true;
                //HttpContext.Current.Response.AddHeader("Content-disposition", String.Format("attachment; filename=\"{0}.pptx\"", PresentationName));
                //HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
                //HttpContext.Current.Response.AddHeader("Content-Length", buffer.Length.ToString());
                //HttpContext.Current.Response.BinaryWrite(buffer);
                //HttpContext.Current.Response.Flush();
                //HttpContext.Current.Response.Close();
    
    
            }
            catch (Exception ex)
            {
            }
            return downloadToken;
        }
    

    in jquery

    $.ajax({
            type: "POST",
            url: AQ.AMT.Url + "/Home/StoreImage",
            //async: false,
            data: JSON.stringify({ request: request }),
            contentType: "application/json; charset=utf-8",
            dataType: "json", 
            success: function (Data) {
    
                var _tempPPT = AQ.AMT.Url + "/Download/Temp/" + Data.Result + ".pptx";
                // Trick for making downloadable link
                a = document.createElement('a');
                a.href = _tempPPT;// window.URL.createObjectURL(xhttp.response);
                a.id = "idanchrPPT";
                // Give filename you wish to download
                var today = new Date();
                var dd = today.getDate();
                var mm = today.getMonth() + 1; //January is 0!
                var yyyy = today.getFullYear();
                if (dd < 10) {
                    dd = '0' + dd
                }
                if (mm < 10) {
                    mm = '0' + mm
                }
                today = dd + '/' + mm + '/' + yyyy;
                if (flipName == "")
                    a.download = "" + name + "-" + today + ".pptx";
                else
                a.download = "" + name + "-" + flipName + "-" + today + ".pptx";
                a.style.display = 'none';
                document.body.appendChild(a);
                a.click();
                $("#idanchrPPT").remove();
    
    
                //deleting the file
                var deleteFiles = {};
                deleteFiles.FilePath = Data.Result;
                setTimeout(function () {
                    $.ajax({
                        type: "Post",
                        data: JSON.stringify({ deleteFiles: deleteFiles }),
                        url: AQ.AMT.Url + "/Home/DeleteExportedPPt",
                        async: true,
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (result) {
                        },
                        error: function (result) {
                        }
                    });
                }, 1000);
            },
            error: function (e) {
            }
        });