我正在尝试动态生成CSV文件,并允许用户在API被命中时下载它。这是我想象的用户互动
User hit a button ->
jquery do $.get to api ->
api endpoint prepares data ->
api endpoint pass in data to another function to generate csv
到目前为止,这是我的代码
public function test(){
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
// Disable caching
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // HTTP 1.0
header("Expires: 0"); // Proxies;
$f = fopen("php://output", "w");
$test_data = array(
array(
'something1' => '2'
),
array(
'somethign2' => '3'
),
);
foreach($test_data as $line){
fputcsv($f, $line, ',');
}
fclose($f);
}
我发现浏览器不是下载csv,而是简单地呈现结果的内容
2
3
当我使用Chrome在网络中查看时。
我尝试将内容类型更改为强制下载,但仍然具有相同的结果
任何帮助都将不胜感激。
由于
答案 0 :(得分:2)
您无法使用ajax下载内容。这是一个安全功能(javascript无法以任何方式与用户的文件系统交互)。没有插件,没有黑客,它无法完成。
您不必尝试使用javascript下载文件,而是必须将浏览器本身指向该文件。如果您需要将数据传递到后面,可以使用表单执行此操作...
$("#button").click(function(){
$("<form id='hiddenform' action='myAPIEndpoint'><input type='hidden' name='parameter1' value='somevalue' /></form>")
.apendTo("body");
$("#hiddenform").submit(). remove();
});
或者如果您不需要向后端输入任何数据,您可以使用指向下载页面的常规链接。