Ich habe einige PHP-Code, der eine Abfrage auf eine Datenbank ausführt, speichert die Ergebnisse in eine CSV-Datei und ermöglicht dann dem Benutzer, die Datei herunterzuladen. Das Problem ist, die CSV-Datei enthält HTML-Seite um den tatsächlichen CSV-Inhalt.Forcing-Datei-Download in PHP - innerhalb Joomla-Framework
Ich habe alle verwandten Fragen hier bereits gelesen, einschließlich this one. Leider existiert mein Code innerhalb von Joomla, und selbst wenn ich versuche, auf eine Seite umzuleiten, die nur Header enthält, umgibt Joomla sie automatisch mit einem eigenen Navigationscode. Dies geschieht nur zum Zeitpunkt des Downloads; Wenn ich mir die CSV-Datei ansehe, die auf dem Server gespeichert ist, enthält sie nicht den HTML-Code.
Kann mir jemand mit einem Weg helfen, einen Download der tatsächlichen CSV-Datei zu erzwingen, wie es auf dem Server ist, anstatt als der Browser es bearbeitet wird? Ich habe versucht, den Header Standort verwendet wird, wie folgt aus:
header('Location: ' . $filename);
aber es öffnet die Datei im Browser, anstatt zwingt den Dialog zum Speichern.
Hier ist meine aktuellen Code:
//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;
EDITS Volle URL sieht wie folgt aus:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers
mit dem eigentlichen Download-Link wie folgt aussehen:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export
MOR E EDITS Hier ist eine Einstellung der Seite, auf der sich der Code befindet. Die generierte Datei zieht immer noch den HTML-Code für das Untermenü ein. Der Code für den ausgewählten Link (Export als CSV) ist jetzt
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Hier ist ein Screenshot der erzeugten, gespeicherten Datei:
Es während der schrumpften Laden Sie hier hoch, aber der gelb hervorgehobene Text ist der HTML-Code für die Subnav (Kunden auflisten, neuen Kunden hinzufügen, als CSV exportieren). So sieht mein vollständiger Code jetzt aus; wenn ich nur das letzte Stück HTML loswerden könnte, wäre es perfekt.
$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);
UPDATE Bjorn
Hier ist der Code (glaube ich), die für mich gearbeitet. Verwenden Sie den RAW-param in dem Link, der die Aktion aufruft:
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Da dies verfahren war unser Link in einer Datei namens customers.php, die wie folgt aussieht:
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;
}
Also, wenn ein Benutzer hat auf den obigen Link geklickt, die Datei export_csv.php ist automatisch enthalten.Diese Datei enthält den gesamten tatsächlichen Code:
Sie müssen wahrscheinlich Joomla's URL-Rewriting für diesen speziellen Fall ausschalten. Können Sie einige vollständige URLs und Ihre .htaccess-Datei anzeigen? –
OP bearbeiten, um angeforderte Informationen aufzunehmen. – EmmyS
Ah, okay, das ist anders: Joomla schlägt wahrscheinlich die Kopf-/Fußzeile auf die Ausgabe in der Indexdatei, das kann nicht durch Hinzufügen einer Regel in .htaccess behoben werden ... Benötigt einen Joomla-Experten zum Aussortieren –