文件下载但保存文件对话框未打开

时间:2017-07-17 16:33:12

标签: c# asp.net sql-server google-chrome extjs5

使用ASP.NET,ExtJS5,SQL Server和ClosedXML。

我正在使用ExtJS调用数据库存储过程,并使用ClosedXML将结果保存到服务器上的excel文件中。

正在正确创建文件,并查看网络检查器,我可以验证文件是否正在下载,但我没有得到任何Save对话。我发现的只是禁用弹出窗口的解决方案(我很乐意遇到这个问题)。

我尝试过使用Chrome,Firefox和IE,每个都有相同的故事。

调用服务的面板:

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
                }
            })
        }
    }]
});

相关的服务器端代码

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

1 个答案:

答案 0 :(得分:0)

@ Gusman的评论帮助我找出了我可以看的地方。问题确实存在于前端代码中。我在我的按钮处理程序中添加了一个附加了不可见iframe的函数。

p = perms(1:9);
S = p(:,1)+(13.*p(:,2)./p(:,3))+p(:,4)+(12.*p(:,5))-p(:,6)-11+(p(:,7).*p(:,8)./p(:,9))-10 == 66;
sum(S)
p(S,:)

我还修改了服务器代码,将文件保存到服务器上的临时文件夹中,供客户端检索。