【问题标题】:AJAX request to database - download .csv file对数据库的 AJAX 请求 - 下载 .csv 文件
【发布时间】:2016-12-21 21:17:55
【问题描述】:

我有一个调用 exportCSV 函数的按钮。这个函数对我的 postgres 数据库执行一个 select 语句,并通过 AJAX 请求返回结果。

如何将通过浏览器提供的响应内容作为 .csv 文件返回给客户端?目前,该代码仅在浏览器控制台中提供响应。任何建议将不胜感激。一旦 php 启动,就会有一个 smarthandler 类负责数据库交互。

导出CSV函数

exportCSV: function () {
    var me = this;
    var message = 'Are you sure you want to generate the CSV?';
    var icon = Ext.Msg.QUESTION;

    Ext.Msg.show({
        title: 'Confirm Execution',
        message: message,
        buttons: Ext.Msg.YESNO,
        icon: icon,
        fn: function(btn) {
            if(btn === 'yes') {
                // TODO: Probably should handle an error here.
                Ext.Ajax.request({
                    url: 'data.php',
                    async: true,
                    params: {
                        action: 'export-csv',
                        id: me.currentRecord.data.id,
                        type: 'Carrier'
                    },
                    success: function(response,opts) {
                        var data = Ext.decode(response.responseText);
                        var csvContent = "data:text/csv;charset=utf-8,";
                        data.forEach(function(infoArray, index){
                            dataString = infoArray.join(",");
                            csvContent += index < data.length ? dataString+ "\n" : dataString;
                        });
                        var encodedUri = encodeURI(csvContent);
                        var link = document.createElement("a");
                        link.setAttribute("href", encodedUri);
                        link.setAttribute("download", "carrier_profile.csv");
                        document.body.appendChild(link); // Required for FF

                        link.click(); // This will download the data file named "carrier_profile.csv".
                    }
                });
            }
        }

    });
}

PHP

else if($action == 'export-csv') {
// Create an array of filters.
$parsedFilters = array();
// TODO: Sanitize the properties better.
if(isset($_REQUEST['filter'])) {
    $filters = json_decode($_REQUEST['filter']);
    foreach($filters as $record)
        array_push($parsedFilters,array($record->property => $record->value));
}

// Convert a request for a specific ID into a filter.
if(isset($_REQUEST['id']))
    array_push($parsedFilters,array('id' => $_REQUEST['id']));

$objectHandler = new SmarterHandler($typeDefinition);
$records = $objectHandler->read($type,$parsedFilters);

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=file.csv');

if(count($records) > 0) {
    $record = $records[0];
    $headings = array();
    foreach($record as $key => $value) {
        if(is_scalar($value)) {
            $headings[] = $key;
            echo $key.",";
        }
    }

    echo "\r\n";

    foreach($records as $record) {
        foreach($headings as $key) {
            echo $record[$key].",";
        }

        echo "\r\n";
    }
}

exit();

}

【问题讨论】:

    标签: javascript ajax postgresql csv export


    【解决方案1】:

    我认为您正在寻找的内容可以按照accepted answer for this question 中的步骤来完成。

    假设您的数据格式正确(包括 csv 数据之前的 data:text/csv;charset=utf-8),要下载它,您可以创建一个隐藏链接并模拟点击

    var encodedUri = encodeURI(csvContent);
    var link = document.createElement("a");
    link.setAttribute("href", encodedUri);
    link.setAttribute("download", "my_data.csv");
    document.body.appendChild(link); // Required for FF
    
    link.click(); // This will download the data file named "my_data.csv".
    

    【讨论】:

    • 感谢帕特里克的回复。这就像一个魅力。但是 - 我如何使用我的 SQL 查询将数据填充到 postgresql?它使用示例中提供的硬编码值完美地工作 var data = [["name1", "city1", "some other info"], ["name2", "city2", "more info"]];
    • @Jukebox 我不确定我是否理解您的问题...您在数据库上运行 SQL 查询时遇到问题吗?还是解析查询响应时出现问题?
    • @T Patrick ...我很好地运行了 SQL 查询,并且可以在浏览器检查窗口中看到响应。在您提供的示例中,填充 csv 的“数据”变量是静态设置的 - 无论如何要将“数据”变量设置为从我的 SQL 查询返回的信息
    • @Jukebox 从您的示例中,您应该能够从success 回调中获得响应,例如:Ext.Ajax.request({ url: 'data.php', async: true, params: { action: 'export-csv', id: me.currentRecord.data.id, type: 'Carrier' }, success: function(d) { var data = d; // Then proceed with csv code } });
    • @T Patrick 我已经添加了成功函数,但是现在当我通过我的 GUI 执行它时,它返回以下错误 - 你有什么想法吗? “Ext.JSON.decode(): You're trying to decode an invalid JSON String:” 后跟一个逗号分隔的值列表,我的 SQL 返回了
    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多