2013-03-13 5 views
17

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-DispositionContent-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); 
+0

この問題に対するjavascriptの解決方法については、http://stackoverflow.com/questions/4130849/convert-json-format-to-csv-format-for-ms-excelをご覧ください。 – Impirator

+0

'json_decode'は何時でも' null'を返しますか? – Jon

+0

ファイルはダウンロードしたくないのですか?ブラウザで開きますか?それが問題だ? – Anton

答えて

5

に留意されたいです。あなたが持っているすべての関数はファイルのパス(すなわち文字列)を必要とします。ハンドルはありません。特にbasename,filesize、およびreadfileです。したがって、これらの関数呼び出しのどれも正しく動作しません。またbasenameはファイル拡張子を返しません。ただ、@Joshuaバーンズとして

'Content-Disposition: attachment; filename=data.csv' 

すなわち、あなたが望むものは何でもそれを呼び出すことも、必ずfputcsvに配列を渡すか、assocパラメータを使用している作る、と言います。

+0

これは問題を解決するために必要なすべてでした。私は問題に作業コードを編集して、人々が修正を見ることができるようにします。ありがとうございました! – Impirator

3

json_decode()はオブジェクトではなく、配列に要素を変換します。 fputcsv()は渡されたデータが配列であると想定します。

$jsonArray = json_decode($_POST['json']); 

へ:

$jsonArray = json_decode($_POST['json'], True); 

をそして、それはあなたの問題を解決していないかどうかを確認

私は変更することをお勧めしたいです。

このような問題に取り組むためにしようとすると、私は非常にdisplay_errorsを有効にして見ることがE_ALLからerror_reportingを設定することをお勧めしたい場合がありますが、上で不足しているエラーのいくつかの並べ替え:tmpfile()を返し

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

// Rest of your code here 
0

まず、この文字列をチェックし、私はそれを変更します

header('Content-Disposition: attachment; filename="'.basename($tmp).'"'); 

私はブラウザの互換性で、一度に問題があった:)

0

一つの問題はtmpfile()は、ファイルハンドルを返すことです一方、filesizeはパラメータとしてファイル名をとります。
次の行:任意の出力が起こる前に実行されているすべてのコールは、ヘッダに

header('Content-Length: 0'); 

チェック():

おそらく
header('Content-Length: ' . filesize($tmp)); 

は、次のように評価されます。

関連する問題