2016-10-14 4 views
0

В моем приложении я использую один обработчик ashx для загрузки ppt. В этом случае я создам один снимок экрана (текущий экран как изображение) и передам это имя изображения одному обработчику (ashx) из jquery. Но я не могу отслеживать статус загрузки.return response back to ajax from ashx handler in C#

Если есть способ вернуть ответ от этого обработчика в jquery. то есть я хочу знать, когда эта загрузка закончится.

мой текущий сценарий как этот

  1. JQuery будет генерировать одну строку base64 и передать эту строку в код позади Ajax вызова для преобразования, что изображения и сохранить этот образ в одном месте

  2. на вызов успеха этого запроса ajax он получит это имя изображения и передаст это имя изображения обработчику

  3. Я вызываю этот обработчик с помощью «window.location.href»

мой код

Ajax вызова для сохранения изображения

$.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 код для загрузки 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); 

      } 
    } 

ответ

0

я получил одно решение для этого, вместо того, чтобы использовать обработчик загружая файлы, которые я использовал ajax и jquery. в этом в коде позади я создам ppt и сохраню ppt в некоторой папке, и я передам это имя в ответ ajax и использую тег привязки, чтобы включить загрузку на самой стороне клиента.

Сохранение РРТ

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

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