2013-03-13 5 views
17

मैं एक छोटी PHP स्क्रिप्ट बनाने की कोशिश कर रहा हूं जो JSON स्ट्रिंग लेता है, इसे CSV प्रारूप में परिवर्तित करता है (fputcsv का उपयोग करके), और यह CSV डाउनलोड की गई .csv फ़ाइल के रूप में उपलब्ध कराता है। मेरा विचार क्रोनबॉज के बारे में चिंता करने या डिस्क स्पेस से बाहर होने के लिए tmpfile() का उपयोग करना था, लेकिन मुझे जादू होने की प्रतीत नहीं होती है।एक अस्थायी फ़ाइल को डाउनलोड करने के लिए

यहाँ मेरी प्रयास है, जो 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); 
+0

इस समस्या के लिए जावास्क्रिप्ट समाधान के लिए, http://stackoverflow.com/questions/4130849/convert-json-format-to-csv-format-for-ms-excel पर एक नज़र डालें। – Impirator

+0

क्या किसी भी मौके से 'json_decode' वापसी' शून्य 'है? – Jon

+0

तो फाइल सिर्फ डाउनलोड नहीं करना चाहती है? और ब्राउज़र में खोला? यही दिक्कत है? – Anton

उत्तर

5

ध्यान दें कि tmpfile() एक रिटर्न फ़ाइल हैंडल, लेकिन आपके पास सभी कार्यों को एक फ़ाइल पथ (यानी एक स्ट्रिंग) की आवश्यकता है, एक हैंडल नहीं - विशेष रूप से basename, filesize, और readfile। तो उनमें से कोई भी फ़ंक्शन कॉल सही तरीके से काम नहीं करेगा। basename भी एक फ़ाइल एक्सटेंशन वापस नहीं करेगा। बस इसे कहते जो चाहो, यानी

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

@Joshua बर्न्स भी कहते हैं, 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 स्थापित करने की सलाह देते हैं, अगर वहाँ त्रुटि आप ले पा रहे हैं किसी प्रकार:

<?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)); 

शायद के रूप में मूल्यांकन किया जाता है।

संबंधित मुद्दे