JSON文字列を使用して(fputcsv
を使用して)CSV形式に変換し、そのCSVをダウンロードした.csvファイルとして利用できるようにする短いPHPスクリプトを作成しようとしています。私の考えは、tmpfile()
を使用してcronjobsやディスク領域が不足することを心配しないようにすることでしたが、私は魔法を起こすように見えることはできません。一時ファイルをダウンロードする方法
はここthe PHP docs of 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);
この問題に対するjavascriptの解決方法については、http://stackoverflow.com/questions/4130849/convert-json-format-to-csv-format-for-ms-excelをご覧ください。 – Impirator
'json_decode'は何時でも' null'を返しますか? – Jon
ファイルはダウンロードしたくないのですか?ブラウザで開きますか?それが問題だ? – Anton