fputcsv
JSON 文字列を受け取り、それを CSV 形式に変換し (を使用して)、その CSV をダウンロードした .csv ファイルとして使用できるようにする短い PHP スクリプトを作成しようとしています。私の考えでは、tmpfile()
cron ジョブやディスク容量の不足を心配する必要はありませんでしたが、魔法を起こすことができないようです。
のPHPドキュメントreadfile
から変換された例である私の試みは次のとおりです。
$tmp = tmpfile();
$jsonArray = json_decode( $_POST['json'] );
fputcsv($tmp, $jsonArray);
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='.basename($tmp));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($tmp));
ob_clean();
flush();
readfile($tmp);
Content-Disposition
およびヘッダーが間違っているように感じContent-Transfer-Encoding
ますが、修正方法がわかりません。たとえば、basename($tmp)
何も返されないようで、text/csv
バイナリ エンコーディングとして転送されるかどうかはわかりません。同様に、echo filesize($tmp)
も空白です。私がここで試みていることを行う方法はありますか?
[編集]
**以下は、受け入れられた回答の結果として私が書いた作業コードです:*
$jsonArray = json_decode( $_POST['json'], true );
$tmpName = tempnam(sys_get_temp_dir(), 'data');
$file = fopen($tmpName, 'w');
fputcsv($file, $jsonArray);
fclose($file);
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=data.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($tmpName));
ob_clean();
flush();
readfile($tmpName);
unlink($tmpName);