当使用连接到 ajax 的 btn 时 运行 `headers`

When to run `headers` while using a btn connected to ajax

我用 HTML 创建了一个按钮。
该按钮调用 Jquery 函数 on('click')
现在,ajax 被触发从 PHP.
获取数据 PHP脚本应该输出一个excel文件并打开一个save dialog供用户下载excel文件。

所以我有三个文件:Main PHP、JS 和 back-end PHP.
如果我将 headers 放在 Main PHP 中,save dialog 会在我进入页面时出现。 (不是按下按钮时)
如果我将 headers 首先放在 "back-end PHP" 中,则什么也不会发生。

所以,我应该把 "headers" 放在哪里?
Maby 我不能这样做吗?

HEADERS

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"file.xlsx\"");
header("Cache-Control: max-age=0");

HTML 主按钮 PHP

<button class="btn btn-default" id="btnExportElementdata"><span class="glyphicon glyphicon-save" title="Spara"></span></button>

JS

//Btn Save
$('#btnExportElementdata').on('click', function(){
    //Fetch selected ObjNr
    objNr = $('#selectObjekt').val();
    //Send objNr to php and fetch elementData
    $.ajax({
        url: '../phpexcel/php/exportElementData.php',
        method: 'POST',
        data: {objNr : objNr},
        success: function(result){
            $('#elementData').append(result);
        }
    })       
})

Back-End PHP

<?php
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"results.xlsx\"");
header("Cache-Control: max-age=0");

//Load db connection
require("conf.php");
//Check if usr is logged in
if(empty($_SESSION['user'])){
  header("Location: index.php");
  die("Redirecting to index.php"); 
}

//Check IF post
if(!empty($_POST['objNr'])){
  //Store post in var
  $objNr = $_POST['objNr'];


  /** Error reporting */
  error_reporting(E_ALL);

  //Load phpexcel includes    
  require '../Classes/PHPExcel.php';

  /** PHPExcel_Writer_Excel2007 */
  include '../Classes/PHPExcel/Writer/Excel2007.php';

  // Create new PHPExcel object
  $objPHPExcel = new PHPExcel();

  // Set properties
  $objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
  $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
  $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
  $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
  $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");


  // Add some data
  $objPHPExcel->setActiveSheetIndex(0);
  $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Nr');
  $objPHPExcel->getActiveSheet()->SetCellValue('B1', 'Höjd');
  $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Typ');
  $objPHPExcel->getActiveSheet()->SetCellValue('D1', 'Längd');
  $objPHPExcel->getActiveSheet()->SetCellValue('E1', 'AV');
  $objPHPExcel->getActiveSheet()->SetCellValue('F1', 'Öppningar');

  $objPHPExcel->getActiveSheet()->SetCellValue('G1', 'Vikt');


  //Fetch data from DB
  $query = "SELECT * FROM element WHERE objekt_nr = '$objNr' ORDER BY length(element_nr), element_nr ASC";
  try{
    $stmt = $db->prepare($query);
    $result = $stmt->execute();
  }
  catch(PDOException $ex){
    die("Failed to run query: " . $ex->getMessage());
  }
  //Insert on first row after heading 
  $row = 2;
  while($value = $stmt->fetch()){
    //Set start Column
    $column = "A";

    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['element_nr']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['hojd']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['typ']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['langd']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['avdrag']."");
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['oppningar']."");

    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['vikt']);

    //INCREASE Row Nr
    $row++;
}

// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle($objNr);

// Write file to the browser
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save('file.xlsx');

}
else{
  echo 'Välj objektnummer..';
}

save dialog 之外的所有脚本都工作正常!
如果我将文件保存在服务器上,它会完美无缺。
这个问题是关于 headers!

您需要从文件中删除那些 headers。

您可以根据需要使用 ajax,但您必须 return 仅 link 文件所在的位置并在浏览器中显示它。当用户单击此 link 时,将调用一个函数。您将在此函数中设置 headers,这将强制下载保存的文件。我希望这对你有意义。