PHP实现JSON转CSV:无需服务器存储直接浏览器下载
直接在浏览器生成并下载CSV,不存储服务器文件的PHP方案
我们现有一段PHP代码可以将JSON转换为CSV,功能正常,但会在服务器生成download.csv文件供用户下载。想请教:有没有办法直接在浏览器端生成并下载CSV,不在服务器上存储真实的CSV文件?
原代码如下:
<?php function convertJsonToCSV($jsonString, $csvFile) { $jsonArray = json_decode($jsonString, true); $fp = fopen($csvFile, 'w'); $header = false; foreach ($jsonArray as $line) { if (empty($header)) { $header = array_keys($line); fputcsv($fp, $header); $header = array_flip($header); } fputcsv($fp, array_merge($header, $line)); } fclose($fp); return; } $jsonString = '[ { "Id": "1", "Name": "Lion", "Type": "Wild", "Role": "Lazy Boss" }, { "Id": "2", "Name": "Tiger", "Type": "Wild", "Role": "CEO" }, { "Id": "3", "Name": "Jaguar", "Type": "Wild", "Role": "Developer" } ]'; $csvFile = 'download.csv'; convertJsonToCSV($jsonString, $csvFile); echo 'JSON to CSV converted. <a href="' . $csvFile . '" target="_blank">Download CSV file</a>';
解决方案
完全可以实现,核心是利用PHP的php://output输出流替代本地文件路径,同时添加HTTP响应头让浏览器识别为下载文件。修改后的完整代码如下:
<?php $jsonString = '[ { "Id": "1", "Name": "Lion", "Type": "Wild", "Role": "Lazy Boss" }, { "Id": "2", "Name": "Tiger", "Type": "Wild", "Role": "CEO" }, { "Id": "3", "Name": "Jaguar", "Type": "Wild", "Role": "Developer" } ]'; // 设置HTTP响应头,触发浏览器下载 header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="download.csv"'); $jsonArray = json_decode($jsonString, true); // 打开PHP输出流,直接输出到浏览器 $fp = fopen('php://output', 'w'); $header = false; foreach ($jsonArray as $line) { if (empty($header)) { $header = array_keys($line); fputcsv($fp, $header); $header = array_flip($header); } fputcsv($fp, array_merge($header, $line)); } fclose($fp); exit;
关键改动说明
- 替换文件路径为
php://output:这是PHP内置的输出流,会直接将内容输出到HTTP响应中,不需要写入服务器本地文件 - 添加响应头:
Content-Type告诉浏览器这是CSV格式内容,Content-Disposition指定文件名并触发下载行为,而非在浏览器中直接显示内容 - 移除了生成服务器文件和输出下载链接的逻辑,处理完成后直接输出CSV内容即可
内容的提问来源于stack exchange,提问作者JGeer
相关产品推荐
相关产品推荐

