2016-12-03 3 views
0

Ich habe eine Erfolgsfunktion, die den Server trifft, eine Liste der Daten sendet und eine Excel-Datei für die verarbeiteten Daten erstellt. Der ganze Code funktioniert gut, aber ich kann die Datei nicht herunterladen. Datei wird auf dem Server erstellt.Datei über Erfolgsfunktion herunterladen

Client-Seite Code ist ..

MOCService.getFilterExcel($scope.filterExcel).success(function (data, responce) { 
        console.log(responce) 
        return responce; 
       }) 

Server-Seite:

public ActionResult getFilterExcel(List<FilterExcel> data) 
    { 
     System.Data.OleDb.OleDbConnection conn = null; 
     try 
     { 


      string filename = ""; 

      var oldfilename = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\datafiles\\lswm\\reports.xlsx"; 
      filename = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\datafiles\\report\\report" + HttpContext.User.Identity.Name + ".xls"; 

      System.IO.File.Copy(oldfilename, filename, true); 
      conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + "; Extended Properties=\"Excel 12.0 Xml;HDR=NO\";"); 
      conn.Open(); 

      //return null; 
      int i = 3; 
      foreach (var item in data) 
      { 
       var strsql = "insert into [Report$C" + (i) + ":L" + (i) + "] (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10)values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')"; 
       var cmd = conn.CreateCommand(); 
       cmd.CommandText = string.Format(strsql, item.ccrfNo, 
        item.requestDate, 
        item.requestedBy, 
        item.title, 
        item.changeImpact, 
        item.plant, 
        item.division, 
        "", 
        item.taskStatus, 
        item.currentPhase 
        ); 
       var rowcount = cmd.ExecuteNonQuery(); 
       i++; 
      } 

     } 
     catch(Exception ex) 
     { 

     } 
     finally 
     { 
      if (conn != null && conn.State == ConnectionState.Open) conn.Close(); 
     } 
     return File(Request.PhysicalApplicationPath + "\\datafiles\\report\\report" + HttpContext.User.Identity.Name + ".xls", "Application/MS-excel", "report" + HttpContext.User.Identity.Name + ".xls"); 
    } 

Und wenn ich die Aktion-Methode direkt von URL drücken Sie dann die Datei heruntergeladen wird, sondern über Anwendung ist es nicht herunterladen.

+0

Sie können keine Dateien mit Ajax herunterladen. Sie müssen 'location.href = ...' im Erfolgs-Callback verwenden, um eine Methode aufzurufen, die die Datei zurückgibt –

+0

ist die Datei, die Sie herunterladen möchten, nur Excel? oder gibt es auch Chancen für andere Dateitypen? –

+0

Mögliches Duplikat von [Lade eine Datei von jQuery.Ajax herunter] (http://stackoverflow.com/questions/4545311/download-a-file-by-jquery-ajax) –

Antwort

0
var blob = new Blob([res.data], {type: "application/*"}); 
     var objectUrl =(window.URL || window.webkitURL).createObjectURL(blob); 
     var downloadLink = document.createElement("a"); 
     document.body.appendChild(downloadLink); 
     downloadLink.style = "display: none"; 
     downloadLink.href = objectUrl; 
     downloadLink.download = "Sample.xlsx"; 
     downloadLink.click(); 

das funktioniert für mich.

0

Die beste Methode, um Dateien mit AJAX herunterzuladen, ist FileSaver.js. Dies behandelt viele verschiedene Tricks, die Sie sonst selbst tun müssten. Sie müssen also nur das Blob api verwenden, um das Blob selbst zu erhalten, und es mit dem FileSaver.js kombinieren, um die Datei auf der Festplatte zu speichern.

P.S. Es gibt mehrere Informationen über Google und SO (z. B. here), wie Sie den Blob mit AJAX erhalten, und dann können Sie FileSaver.js Github-Seite verwenden, um herauszufinden, wie Sie dieses Blob auf der Festplatte speichern.

Verwandte Themen