bla*_*cat 5 javascript php csv ajax jquery
我有一个php创建 CSV 文件的页面,然后浏览器会自动下载该文件。这是一个带有示例数据的版本 - 效果很好。
<?php
$cars = array(
  array("Volvo",22,18),
  array("BMW",15,13),
  array("Saab",5,2),
  array("Land Rover",17,15)
  );
// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=csvfile.csv');
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
// output the column headings
fputcsv($output, array('Car', 'Year', 'Miles' ));
//Loop through the array and add to the csv
foreach ($cars as $row) {
    fputcsv($output, $row);
}
?>
我希望能够从另一个页面运行它,ajax以便用户可以在csv不离开主页的情况下生成/下载一个。这是JavaScript我在主页上使用的。在我的真实页面中,我使用的是通过 ajax 传入的数据。
$('button[name="exportCSVButton"]').on('click', function() {
    console.log('click');
    $.ajax({
        url: 'exportCSV.php',
        type: 'post',
        dataType: 'html',
        data: {
            Year: $('input[name="exportYear"]').val()
        },
        success: function(data) {
            var result = data
            console.log(result);
        }
    });
});
当我单击按钮触发脚本时,它会运行,但不是保存/下载到csv它而是将整个内容打印到控制台。有什么办法可以实现我想要的吗?无需实际将文件保存到服务器并重新打开。
我已经通过ajax完成了csv文件下载
PHP代码
    <?php
         function outputCsv( $assocDataArray ) {
            if ( !empty( $assocDataArray ) ):
                $fp = fopen( 'php://output', 'w' );
                fputcsv( $fp, array_keys( reset($assocDataArray) ) );
                foreach ( $assocDataArray AS $values ):
                    fputcsv( $fp, $values );
                endforeach;
                fclose( $fp );
            endif;
            exit();
        }
        function generateCsv(){
            $res_prods = $wpdb->get_results( "SELECT * FROM `{$wpdb->prefix}products` ", OBJECT );
            $products= [];
            foreach ($res_prods as $key => $product) :
                $product_id = $product->ID;
                $products[$product_id]['product_id'] = $product_id;
                $products[$product_id]['name'] = $product->name;
            endforeach;
            return outputCsv( $products);
      }
jQuery AJAX
jQuery(document).on( 'click', '.btn_generate_product', function(e) {
    var product_id = jQuery(this).data('product_id');
    jQuery.ajax({
        url : "ajaxurl", 
        type: 'POST',
        data: { product_id },
        success: function(data){
              /*
               * Make CSV downloadable
               */
              var downloadLink = document.createElement("a");
              var fileData = ['\ufeff'+data];
              var blobObject = new Blob(fileData,{
                 type: "text/csv;charset=utf-8;"
               });
              var url = URL.createObjectURL(blobObject);
              downloadLink.href = url;
              downloadLink.download = "products.csv";
              /*
               * Actually download CSV
               */
              document.body.appendChild(downloadLink);
              downloadLink.click();
              document.body.removeChild(downloadLink);
        }
    });
});
我不久前通过创建一个隐藏的 iframe并通过 javascript 将 iframe 的源设置为一个 php 文件,该文件像您的 exportCSV.php 一样发送适当的标头和数据。
但是,如果您不喜欢这个想法,您可以使用jQuery File Download或FileSaver.js等库