2017-07-17 2 views
0

Verwenden von ASP.NET, ExtJS5, SQL Server und ClosedXML.Dateidownload, aber Dateidialog wird nicht geöffnet

Ich verwende ExtJS, um auf eine gespeicherte Datenbankprozedur zuzugreifen und die Ergebnisse in einer Excel-Datei auf dem Server mit ClosedXML zu speichern.

Die Datei wird ordnungsgemäß erstellt, und mit Blick auf den Netzwerkinspektor kann ich überprüfen, ob die Datei heruntergeladen wird, aber ich erhalte keine Art von Save Dialog. Alles, was ich gefunden habe, sind Lösungen, um das Pop-up zu deaktivieren (ich würde dieses Problem gerne haben).

Ich habe auf Chrome, Firefox und IE, gleiche Geschichte für jeden versucht.

Die die Platte, die den Dienst aufruft:

Ext.define('Table', { 
    xtype: 'file-table', 
    extend: 'Ext.grid.Panel', 
    title: 'Stuff for Excel', 
    hideHeaders: false, 
    cls: 'striped-grid', 
    store: 'Stuff for Excel Store', 
    requires: [ 
     'Ext.grid.selection.SpreadsheetModel', 
     'Ext.grid.plugin.Clipboard' 
    ], 
    selModel: { 
     type: 'spreadsheet', 
     rowSelect: false, 
     columnSelect: true 
    }, 
    plugins: ['clipboard', 'gridfilters'], 
    features: [{ 
     ftype: 'grouping', 
     hideGroupedHeader: true, 
     startCollapsed: true 
    }], 
    columns: [{ 
     text: '#1', 
     dataIndex: 'Name', 
     flex: 1, 
     filter: { 
      type: 'string', 
      itemDefaults: { 
       emptyText: 'Filter by...' 
      } 
     } 
    }, { 
     text: '#2', 
     dataIndex: 'Type', 
     flex: 1, 
     hidden: true, 
     filter: { 
      type: 'string', 
      itemDefaults: { 
       emptyText: 'Filter by...' 
      } 
     } 
    }, { 
     text: '#3', 
     dataIndex: 'Sub-Type', 
     flex: 1, 
     filter: { 
      type: 'string', 
      itemDefaults: { 
       emptyText: 'Filter by...' 
      } 
     } 
    }, { 
     text: '#4', 
     dataIndex: 'Sub-sub Type', 
     flex: 1, 
     filter: { 
      type: 'string', 
      itemDefaults: { 
       emptyText: 'Filter by...' 
      } 
     } 
    }, { 
     text: '#5', 
     dataIndex: 'Weight', 
     xtype: 'numbercolumn', 
     renderer: function (value) { 
      var out = value * 100; 
      return out.toFixed(1) + ' %'; 
     }, 
     flex: 0 
    }], 
    viewConfig: { 
     stripeRows: true 
    }, 
    bbar: [{ 
     xtype: 'panel', 
     flex: 1 
    }, { 
     xtype: 'button', 
     margin: 5, 
     padding: 10, 
     text: 'Export to Excel', 
     hidden: false, 
     flex: 0, 
     icon: '../Images/ExportReport.png', 
     handler: function() { 
      Ext.Ajax.request({  
       method: 'GET', 
       loadMask: true, 
       url: 'ReportingWebServices.asmx/CreateExcel', 
       params: { 
        'here': are, 
        'some': params 
       } 
      }) 
     } 
    }] 
}); 

Der entsprechende serverseitigen Code

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)] 
public void CreateExcel() 
{ 
    string fileName = "Workbook.xlsx"; 
    string filePath = "path\to\file"; 
    ClosedXML.Excel.XLWorkbook workBook = new ClosedXML.Excel.XLWorkbook(); 

    // Passing params, getting results from database, 
    // building the spreadsheet 

    if (File.Exists(filePath + fileName)) 
    { 
     File.Delete(filePath + fileName); 
    } 

    workBook.SaveAs(filePath + fileName); 

    HttpContext.Current.Response.ClearContent(); 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ContentType = "application/octet-stream"; 
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ";"); 
    HttpContext.Current.Response.TransmitFile(filePath + fileName); 
    HttpContext.Current.Response.Flush(); 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 
+0

Wir können sehen, wie Sie die Datei übertragen, aber nicht wie Sie es aus dem Browser aufgerufen haben. Fügen Sie den Code hinzu, der die Datei herunterlädt, nicht den, der sie sendet, da der Fehler auf der Client-Seite sein sollte. – Gusman

Antwort

0

@ Gusman Kommentar half mir herauszufinden, wo ich suchen könnte. Das Problem war tatsächlich im Front-End-Code. Ich habe meinem Button-Handler eine Funktion hinzugefügt, die einen unsichtbaren Iframe anfügt.

Ich auch von Server-Code geändert, um die Datei in einem temporären Ordner auf dem Server zu speichern, um vom Client abgerufen werden.

Verwandte Themen