J'ai du code PHP qui exécute une requête sur une base de données, enregistre les résultats dans un fichier csv, puis permet à l'utilisateur de télécharger le fichier. Le problème est, le fichier csv contient la page HTML autour du contenu réel de CSV.Forcer le téléchargement de fichiers en PHP - dans le framework Joomla
J'ai déjà lu toutes les questions connexes, y compris this one. Malheureusement, mon code existe dans Joomla, donc même si j'essaye de rediriger vers une page qui ne contient que des en-têtes, Joomla l'entoure automatiquement avec son propre code de navigation. Cela ne se produit qu'au moment du téléchargement. Si je regarde le fichier csv enregistré sur le serveur, il ne contient pas le code HTML.
Quelqu'un peut-il m'aider à forcer le téléchargement du fichier csv actuel tel qu'il est sur le serveur plutôt que d'être modifié par le navigateur? Je l'ai essayé d'utiliser l'emplacement d'en-tête, comme ceci:
header('Location: ' . $filename);
mais il ouvre le fichier dans le navigateur, plutôt que de forcer la boîte de dialogue Enregistrer.
Voici mon code actuel:
//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 URL complète ressemble à ceci:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers
avec le lien de téléchargement réel qui ressemble à ceci:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export
MOR E EDITS Voici une photo de la page sur laquelle se trouve le code; le fichier généré tire toujours le html pour le sous-menu. Le code pour le lien sélectionné (Exporter au format CSV) est maintenant
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Maintenant, voici une capture d'écran du produit, fichier enregistré:
Il a diminué au cours de la télécharger ici, mais le texte surligné en jaune est le code html pour le subnav (liste des clients, ajouter un nouveau client, exporter en tant que csv). Voici à quoi ressemble mon code complet maintenant; si je pouvais me débarrasser de ce dernier morceau de HTML, ce serait parfait.
$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);
MISE À JOUR POUR BJORN
Voici le code (je pense) qui a fonctionné pour moi. Utilisez le RAW dans le lien param qui appelle l'action:
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Parce que c'était la procédure, notre lien était dans un fichier appelé customers.php, qui ressemble à ceci:
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;
}
Alors, quand un l'utilisateur a cliqué sur le lien ci-dessus, le fichier export_csv.php est automatiquement inclus.Ce fichier contient tout le code réel:
<?
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);
Vous devrez probablement désactiver la réécriture d'URL de Joomla pour ce cas spécifique. Pouvez-vous montrer des URL complètes et votre fichier .htaccess? –
Modification de OP pour inclure les informations demandées. – EmmyS
Ahh okay, c'est différent: Joomla tape probablement l'entête/pied de page sur la sortie dans le fichier d'index, ceci ne peut pas être corrigé en ajoutant une règle dans .htaccess ... Un expert Joomla doit trier –