首页 > 解决方案 > 浏览器未从 PHP 脚本下载文件

问题描述

背景:我在网站上有一个表格,用户可以从中选择行,然后单击导出按钮以下载这些行的 .csv。

我正在从前端的表中创建一个数组数组,并通过 AJAX 将该数组传递给一个 PHP 脚本,该脚本使用 fputcsv() 将它们放入 .csv 格式。我能够回显结果,并将结果推送到服务器上的 .csv 文件,并且都可以正确显示。但无论出于何种原因,我都无法让浏览器提供文件供下载。

我参考了很多 stackoverflow 文章,并对 HTTP 标头进行了研究,但似乎没有任何作用。

我的代码粘贴在下面:

<?php 

// this is the array of arrays passed via AJAX
$gaps = $_POST["gaps"];

function array_to_csv_download($array, $filename='export.csv', $delimiter=",") {
    header("Content-type: text/csv");
    header("Cache-Control: no-store, no-cache");
    header('Content-Disposition: attachment; filename="'.$filename.'";');

    // open the "output" stream
    // see http://www.php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq
    $f = fopen('php://output', 'w');

    foreach ($array as $line) {
        fputcsv($f, $line, $delimiter);
    }
}  

array_to_csv_download($gaps, 'gaps.csv');

标签: php

解决方案


好吧,你不能用 AJAX 下载文件。您的代码看起来不错,问题出在前端。

因为您有发布值,所以您需要<form>发送这些值。因此,删除 ajax 请求并使用<form target="_blank" action=".....">. 是必需的target="_blank",因此表单会打开一个新窗口。您可以在代码中已经生成表单,也可以使用document.createElement("form")javascript 代码生成它并构建它。

检查答案以了解 AJAX 无法下载,并检查答案以从表单打开新窗口。

此外,您还可以在此处找到有关如何使用 javascript 生成表单的更多详细信息。


推荐阅读