मेरे पास कुछ PHP कोड है जो डेटाबेस पर एक क्वेरी चलाता है, परिणाम को एक सीएसवी फ़ाइल में सहेजता है, और फिर उपयोगकर्ता को फ़ाइल डाउनलोड करने की अनुमति देता है। समस्या यह है कि, सीएसवी फ़ाइल में वास्तविक सीएसवी सामग्री के आसपास पेज HTML शामिल है।PHP में फ़ाइल डाउनलोड को मजबूर करना - जूमला ढांचे के अंदर
मैंने पहले से ही सभी संबंधित प्रश्न पढ़े हैं, जिनमें this one भी शामिल है। दुर्भाग्यवश मेरा कोड जूमला के भीतर मौजूद है, इसलिए यदि मैं किसी ऐसे पृष्ठ पर रीडायरेक्ट करने का प्रयास करता हूं जिसमें हेडर के अलावा कुछ भी नहीं है, तो जूमला स्वचालित रूप से अपने स्वयं के नेविगेशन कोड से घिरा हुआ है। यह केवल डाउनलोड के समय होता है; अगर मैं सर्वर पर सहेजी गई सीएसवी फ़ाइल को देखता हूं, तो इसमें HTML नहीं है।
क्या कोई भी वास्तविक सीएसवी फ़ाइल के डाउनलोड को मजबूर करने के तरीके से बाहर निकलने में मदद कर सकता है क्योंकि यह सर्वर पर है, ब्राउजर इसे संपादित कर रहा है? मैं हैडर स्थान का उपयोग कर की कोशिश की है, इस तरह:
header('Location: ' . $filename);
लेकिन यह नहीं बल्कि संवाद बचाने के लिए मजबूर कर रहा से ब्राउज़र में फ़ाइल को खोलता है,।
//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename);
exit;
संपादन पूर्ण URL ऐसा दिखाई देगा:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers
वास्तविक डाउनलोड लिंक के साथ
इस तरह लग रही:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export
यहाँ मेरे वर्तमान कोड है MOR ई EDITS यहां पृष्ठ का एक शॉट है जिस पर कोड चालू है; जेनरेट की गई फाइल अभी भी सबमेनू के लिए एचटीएमएल में खींच रही है। चयनित लिंक (सीएसवी के रूप में निर्यात) के लिए कोड अब
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
अब यहाँ है उत्पन्न, सहेजी गई फ़ाइल का एक स्क्रीनशॉट है:
यह दौरान सिकुड़ गया यहां अपलोड करें, लेकिन पीले रंग में हाइलाइट किया गया टेक्स्ट सबनाव के लिए एचटीएमएल कोड है (ग्राहकों को सूचीबद्ध करें, नया ग्राहक जोड़ें, सीएसवी के रूप में निर्यात करें)। यहां मेरा पूरा कोड अब जैसा दिखता है; अगर मैं सिर्फ उस अंतिम बिट से छुटकारा पा सकता हूं तो यह सही होगा। ब्योर्न
लिए
$fp= fopen("php://output", 'w');
$query = "select c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone, a.company, a.address1,
a.address2,a.city,a.state,a.zip,c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id
order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
अद्यतन यहाँ कोड (मुझे लगता है कि) कि मेरे लिए काम किया है। लिंक है कि कार्रवाई कॉल में रॉ परम का उपयोग करें:
switch ($r['subtask']){
case 'add':
case 'edit':
//if the form is submitted then go to validation
include("subnav.php");
if ($r['custFormSubmitted'] == "true")
include("validate.php");
else
include("showForm.php");
break;
case 'delete':
include("subnav.php");
include("process.php");
break;
case 'resetpass':
include("subnav.php");
include("resetpassword");
break;
case 'export':
include("export_csv.php");
break;
default:
include("subnav.php");
include("list.php");
break;
}
तो जब एक:
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
क्योंकि इस प्रक्रियात्मक था, हमारे लिंक जो इस तरह दिखता है एक फ़ाइल customers.php कहा जाता है, में किया गया था उपयोगकर्ता उपरोक्त लिंक पर क्लिक किया गया, export_csv.php फ़ाइल स्वचालित रूप से शामिल है।उस फ़ाइल में सभी वास्तविक कोड हैं:
<?
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
$fp= fopen("php://output", 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
आपको शायद इस विशिष्ट मामले के लिए जूमला के यूआरएल रीराइटिंग को बंद करने की आवश्यकता होगी। क्या आप कुछ पूर्ण यूआरएल और अपनी .htaccess फ़ाइल दिखा सकते हैं? अनुरोधित जानकारी शामिल करने के लिए –
संपादन ओपी। – EmmyS
आह ठीक है, यह अलग है: जूमला शायद इंडेक्स फ़ाइल में आउटपुट पर हेडर/फ़ूटर को थप्पड़ मारता है, इसे .htaccess में नियम जोड़कर तय नहीं किया जा सकता है ... –