Export vers fichier texte

Petit nouveau ! | 7 Messages

15 oct. 2010, 10:01

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 :D )
un petit .jpg vaut mieux qu'un long .doc

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 oct. 2010, 10:25

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

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 314 Messages

15 oct. 2010, 10:27

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 ;)
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

15 oct. 2010, 10:34

la base c'est du mysql ?

Petit nouveau ! | 7 Messages

15 oct. 2010, 11:23

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...
Modifié en dernier par metallifanca le 15 oct. 2010, 11:26, modifié 1 fois.
un petit .jpg vaut mieux qu'un long .doc

ViPHP
ViPHP | 5462 Messages

15 oct. 2010, 11:24

tu sais que tu peux créer des CSV direct avec mysql, pas besion de boucle et compagnie

Petit nouveau ! | 7 Messages

15 oct. 2010, 11:25

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
un petit .jpg vaut mieux qu'un long .doc

ViPHP
ViPHP | 5462 Messages

15 oct. 2010, 11:28

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

Petit nouveau ! | 7 Messages

15 oct. 2010, 11:32

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 :-D
un petit .jpg vaut mieux qu'un long .doc

ViPHP
ViPHP | 5462 Messages

15 oct. 2010, 11:46

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 :-D
ca se fais avec INTO OUFILE :wink:
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);

Petit nouveau ! | 7 Messages

15 oct. 2010, 11:55

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). :D
un petit .jpg vaut mieux qu'un long .doc

ViPHP
xTG
ViPHP | 7331 Messages

15 oct. 2010, 12:01

Peut être que ton compte mysql ne possède pas les droits sur cette fonction.

Petit nouveau ! | 7 Messages

15 oct. 2010, 12:07

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 :)
un petit .jpg vaut mieux qu'un long .doc

ViPHP
ViPHP | 5462 Messages

15 oct. 2010, 13:18

t'avais bien inclue ton connection.inc.php ?

Petit nouveau ! | 7 Messages

15 oct. 2010, 13:37

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...
un petit .jpg vaut mieux qu'un long .doc