Page 1 sur 2
Export vers fichier texte
Posté : 15 oct. 2010, 10:01
par metallifanca
Tout d'abord bonjour à tous,
J'ai un petit souci concernant une fonction (qui doit être toute bête en fait, mais bon...), j'aimerais enregistrer le contenu d'une page web en tant que fichier texte. Cette page web se présente un peu comme un flux rss : date - texte, retour a la ligne, etc... j'aimerais que l'utilisateur puisse avoir accès a un lien sur cette page genre "telecharger la page en texte ici" et que le fait de cliquer sur ce lien cree un fichier texte avec le contenu de la page directement téléchargeable par l'user. Mais si possible, sans avoir ce fichier texte créé au préalable sur le ftp... J'ai trouvé des fonctions pour exporter au format csv, mais pas pour exporter au format .txt
Le but, c'est que ce fichier soit aussi téléchargeable par un téléphone portable, c'est pour ca que je voudrais du .txt
A noter : la page en question est constituée de simple entrées d'une bdd (champ "date" et champ "texte") donc on pourrait faire une boucle qui reprends les entrées de la bdd et exporte le tout en fichier texte...
Merci d'avance (et désolé pour le nombre incroyable de "..." pour un simple texte, c'est tic

)
Re: Export vers fichier texte
Posté : 15 oct. 2010, 10:25
par moogli
Salut,
une solution est d'utiliser la fonction header pour forcer le téléchargement d'un fichier à la volé (
http://www.php.net/manual/fr/function.header.php : exemple 1) avec un content type Content-Type: text/plain.
à la place du readfile il "suffit" d'utiliser echo pour afficher la page.
il faut donc prévoir avant la sauvegarder du contenue de la page dans une variable
ce qui donnent
<?php
$pagecontent = 'ici le contenue de la page oueb qui est affiche. De préférence sans les balise html si non c\'est pas lisible dans un fichier texte';
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename="test.txt"');
echo $pagecontent;
?>
Après je ne sais pas comment est généré la page web mais un lien vers une page (download.php ?) prenant en paramètre la page a afficher ($_GET['page'] ?) et à la fin un meta ou javascript pour renvoyer vers la page précédente (donc celle que l'on souhaite DL) et le tour est jouer.
Attention a l'utilisation de la fonction header, pas d'affichage avant
@+
Re: Export vers fichier texte
Posté : 15 oct. 2010, 10:27
par AoSiX
Salut,
Voilà + ou - la procédure...
<?php
// connexion à la bdd
// imaginons qu'on a une table avec ID, date, texte
// recuperation des infos dans $result
$file_name="article-".$result["ID"].".txt";
$realLink = "csv/".$file_name;
// on peut écrire dedans ?
if (is_writable($realLink))
{
if (!$handle = fopen($realLink, 'w'))
{
echo "Impossible d'ouvrir le fichier ($realLink)";
exit;
}
fwrite($handle, $somecontent);
fwrite($handle,$result["TEXT"]."\n".$result["DATE"]); // tu écris ce que tu veux dans ton fichier
fclose($handle);
if(file_exists($realLink))
{
$size = filesize($realLink);
header("Content-Type: application/force-download; name='$file_name'");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename='$file_name'");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile($realLink);
}
} else {
echo "Le fichier $filename n'est pas accessible en écriture.";
}
?>
C'est pas tésté et pondu à la louche, mais t'as une base de travail

Re: Export vers fichier texte
Posté : 15 oct. 2010, 10:34
par stealth35
la base c'est du mysql ?
Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:23
par metallifanca
Oui, la base c'est du sql...
Avec vos conseils et ceux d'un ami, j'ai réussi, en faisant comme ca :
<?php
session_start();
//date actuelle
$date = gmdate('D, d M Y H:i:s');
header("Content-Type: application/msword"); // pas génial comme type mime, mais bon, en rtf ca fonctionnait pas tout a fait pour l'utilisation que je voulais en avoir. Et en text/plain je n'arrivais pas a avoir les retours a la ligne normaux...
header('Content-Disposition: attachment; filename=test.doc'); // je l'ai mis au format .doc... ca marche aussi
header('Last-Modified: '. $date . ' GMT');
header('Expires: ' . $date);
//header specifique IE parce que sinon il aime pas (trouvé sur un autre site d'aide)
if(preg_match('/msie|(microsoft internet explorer)/i', $_SERVER['HTTP_USER_AGENT'])){
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
}else{
header('Pragma: no-cache');
}
include "connection.inc.php" ; // mon fichier de connection a ma bdd
$sql = "select * from diary order by date ASC";
$requete=mysql_query($sql);
$texte =""; // j'ouvre une variable texte
while ($row=mysql_fetch_array($requete)){
$tmpstmp = $row['date'];
$datej= date('d-m-Y', $tmpstmp);
$texte .= $datej." - ".$row['entree']."\n"; //j'ajoute les lignes contenues dans ma bdd a ma variable texte avec un retour a la ligne a chaque passage de la boucle
};
echo $texte; //et on renvoie tout sur un fichier .doc téléchargeable...
?>
Merci à tous...
Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:24
par stealth35
tu sais que tu peux créer des CSV direct avec mysql, pas besion de boucle et compagnie
Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:25
par metallifanca
Oui, mais c'est pour que les utilisateurs puissent dl le contenu de la table, j'ai pas envie qu'ils aillent trifouiller dans ma bdd avec mysql
Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:28
par stealth35
Oui, mais c'est pour que les utilisateurs puissent dl le contenu de la table, j'ai pas envie qu'ils aillent trifouiller dans ma bdd avec mysql
mysql te créer un fichier CSV direct, plus qu'a le récupérer en php après
Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:32
par metallifanca
Oui, mais comment ? Il faut que ce soit moi qui demande a mysql de générer le fichier csv et puis le mettre a disposition des users? Si c'est ca ca ne m'intéresse pas vu qu'il y a des maj fréquentes et qu'il faudrait a chaque fois recréer le fichier en question. Non, mon système me convient comme ca, moins il y a besoin d'intervention de ma part, mieux c'est

Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:46
par stealth35
Oui, mais comment ? Il faut que ce soit moi qui demande a mysql de générer le fichier csv et puis le mettre a disposition des users? Si c'est ca ca ne m'intéresse pas vu qu'il y a des maj fréquentes et qu'il faudrait a chaque fois recréer le fichier en question. Non, mon système me convient comme ca, moins il y a besoin d'intervention de ma part, mieux c'est

ca se fais avec INTO OUFILE
ini_set('mysql.trace_mode', 1);
//mysql_connect('127.0.0.1', 'root', '');
//mysql_select_db('test');
$temp = tmpfile();
$meta = stream_get_meta_data($temp);
$filename = mysql_real_escape_string($meta['uri']);
fclose($temp);
$sql = "SELECT * INTO OUTFILE '$filename' FROM `diary` ORDER BY `date` ASC";
$query = mysql_query($sql);
readfile($filename);
Re: Export vers fichier texte
Posté : 15 oct. 2010, 11:55
par metallifanca
Ben... ca marche pas...
Code : Tout sélectionner
Warning: mysql_query() [http://www.mysql.com/doc]: Access denied for user 'arnaud014'@'%0.248.211.%' (using password: YES) in /public_html/diary/dl2.php on line 12
Warning: readfile(/tmp/phpraMoxR) [function.readfile]: failed to open stream: No such file or directory in /public_html/diary/dl2.php on line 14
A savoir, mon fichier de connection fonctionne vu que j'ai juste refait l'include, donc ca vient pas de la.
Donc j'en reviens a ma solution (pas propre, mais fonctionnelle).

Re: Export vers fichier texte
Posté : 15 oct. 2010, 12:01
par xTG
Peut être que ton compte mysql ne possède pas les droits sur cette fonction.
Re: Export vers fichier texte
Posté : 15 oct. 2010, 12:07
par metallifanca
Ben voila alors, pour ceux qui rechercheraient la même chose que moi, la méthode de stealth35 si elle fonctionne :
ini_set('mysql.trace_mode', 1);
//mysql_connect('127.0.0.1', 'root', '');
//mysql_select_db('test');
$temp = tmpfile();
$meta = stream_get_meta_data($temp);
$filename = mysql_real_escape_string($meta['uri']);
fclose($temp);
$sql = "SELECT * INTO OUTFILE '$filename' FROM `diary` ORDER BY `date` ASC";
$query = mysql_query($sql);
readfile($filename);
Et si ca marche pas, la mienne :
<?php
session_start();
//date actuelle
$date = gmdate('D, d M Y H:i:s');
header("Content-Type: application/msword"); // pas génial comme type mime, mais bon, en rtf ca fonctionnait pas tout a fait pour l'utilisation que je voulais en avoir. Et en text/plain je n'arrivais pas a avoir les retours a la ligne normaux...
header('Content-Disposition: attachment; filename=test.doc'); // je l'ai mis au format .doc... ca marche aussi
header('Last-Modified: '. $date . ' GMT');
header('Expires: ' . $date);
//header specifique IE parce que sinon il aime pas (trouvé sur un autre site d'aide)
if(preg_match('/msie|(microsoft internet explorer)/i', $_SERVER['HTTP_USER_AGENT'])){
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
}else{
header('Pragma: no-cache');
}
include "connection.inc.php" ; // mon fichier de connection a ma bdd
$sql = "select * from diary order by date ASC";
$requete=mysql_query($sql);
$texte =""; // j'ouvre une variable texte
while ($row=mysql_fetch_array($requete)){
$tmpstmp = $row['date'];
$datej= date('d-m-Y', $tmpstmp);
$texte .= $datej." - ".$row['entree']."\n"; //j'ajoute les lignes contenues dans ma bdd a ma variable texte avec un retour a la ligne a chaque passage de la boucle
};
echo $texte; //et on renvoie tout sur un fichier .doc téléchargeable...
?>
Bonne journée à tous

Re: Export vers fichier texte
Posté : 15 oct. 2010, 13:18
par stealth35
t'avais bien inclue ton connection.inc.php ?
Re: Export vers fichier texte
Posté : 15 oct. 2010, 13:37
par metallifanca
mon fichier de connection fonctionne vu que j'ai juste refait l'include, donc ca vient pas de la.
Ouioui... mais t'en fait pas, ma solution me convient... et j'ai remis le code que tu m'a donné au cas ou quelqu'un d'autre y arriverait...