Export de fichiers

Eléphanteau du PHP | 34 Messages

03 mars 2006, 16:41

Bonjour à tous,
J'ai trouvé pas mal de tutos sur l'upload de fichiers mais je voudrai faire l'inverse.
Explication :
J'ai un formulaire qui permet via des listes de fabriquer une requete SQL et d'extraire les données de ma base dans un fichier texte sur mon disque.
Ce que je voudrai c'est depuis mon formulaire récupérer un chemin et un nom choisi (un INPUT mais lequel?) par l'utilisateur pour écrire le resultat directement sur son disque et pas sur le mien.
J"espère être clair
Merci d'avance
@+

Eléphant du PHP | 312 Messages

03 mars 2006, 16:45

Tu ne peux pas écrire chez lui.
Tu peux écrire un fichier et lui envoyer, ensuite c'est son explorateur qui s'occupe d'écrire le fichier sur le disque dur, mais tu ne peux pas écrire directement chez lui le fichier.
C'est d'ailleurs une chance que ça soit le cas, les arborescences se ressemblent toutes et il serait donc facile d'aller écrire dans les fichiers systèmes du client...

Eléphanteau du PHP | 34 Messages

03 mars 2006, 16:56

Merci pour la réponse
Si je ne peux pas ecrire directement, puis-je ecrire dans un fichier temporaire ?
Je pense que oui sans vraiment savoir comment
Tu peux écrire un fichier et lui envoyer
Mais aprés comment faire pour forcer l'utilisateur à charger ce fichier ou comment lui envoyer le fichier et ensuite me debarasser de ce fichier temporaire.

Merci

Eléphanteau du PHP | 34 Messages

03 mars 2006, 17:22

Désolé j'ai reposté trop vite
Je pense que la solution se trouve dans
<?php
function download($filename) {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($filename) );
    header('Accept-Ranges: bytes');
    header('Content-Length: '.filesize($filename) );
    readfile($filename);
}
?>
Il ne me reste plus qu'a savoir créer un fichier temporaire et a le supprimer mais quand ??

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 mars 2006, 17:40

il te faut utiliser ces entetes là :
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$file);
readfile("files/".$file);
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 34 Messages

06 mars 2006, 12:24

Bonjour et merci pour la réponse,
J'ai inséré les headers comme suis :
if($fp = fopen("fichier_temp/".$fichier.".csv","a")){ //ouverture du fichier en ecriture 
fputs($fp, ereg_replace(",","\t","date_j,".$param.$vent.$hum.$code.$instant.$autre."id_mesure_journ\n"));
while ($tab=pg_fetch_array($query,NULL,PGSQL_BOTH)) 
{
	for ($i=0;$i<$nb_param;$i++) 
	{
		if ($i==$nb_param-1) {fputs($fp, "$tab[$i]");} else {fputs($fp, "$tab[$i]\t");}
	}
fputs($fp, "\n");
}
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$fichier);
readfile("fichier_temp/".$fichier);
      fclose($fp);
echo "ok";      
}else{ // L ouverture a echouee
      echo "Ouverture du fichier impossible";
      exit();
      }
Avec $fichier étant le nom choisi via le formulaire appelant.
Mon probléme est que le fichier écrit sur mon serveur contient bien le résultat de ma requete SQL mais le fichier téléchargé, lui ne contient rien sur ma requête SQL mais prend bien le nom choisi.?

Désolé si mon code n'est pas un modéle du genre mais quant on débute...
Merci d'avance
Ci dessous le code complet de ma page (peut etre pas necessaire)
<?php
session_start();
if(!isset($_SESSION['login'])) {
	echo "Vous n'etes pas autoriser a acceder a cette zone !!";
	header('Location:index.php');
	exit;
}
$login =$_SESSION['login'];
$password = $_SESSION['password'];
$nom = $_SESSION['nom'];
$prenom=$_SESSION['prenom'];
$db =pg_connect("host=localhost dbname=Base_test_LRM user=$login password=$password")
	or die ("Echec sur pg_connect".pg_last_error());

$num_poste=$_SESSION['num_poste'];
$type_fichier = $_POST['type_fichier'];
//echo "Type fichier : ".$type_fichier."<br/>";
$fichier = $_POST['fichier'];
//echo "fichier : ".$fichier."<br/>";


//RECUPERATION DES CHOIX DE LA LISTE PARAM
$choix_param = $_POST['param'];
$param = "";
for ($i=0; $i<count($choix_param); $i++) {
	if ($i==count($choix_param)-1) {$param=$param."$choix_param[$i],";} else {$param=$param."$choix_param[$i],";}
}
//echo $param."<br>";

//RECUPERATION DES CHOIX DE LA LISTE CODE
$choix_code = $_POST['code'];
$code = "";
for ($i=0; $i<count($choix_code); $i++) {
	if ($i==count($choix_code)-1) {$code=$code."$choix_code[$i],";} else {$code=$code."$choix_code[$i],";}
}
//echo $code."<br>";

//RECUPERATION DES CHOIX DE LA LISTE VENT
$choix_vent = $_POST['vent'];
$vent = "";
for ($i=0; $i<count($choix_vent); $i++) {
	if ($i==count($choix_vent)-1) {$vent=$vent."$choix_vent[$i],";} else {$vent=$vent."$choix_vent[$i],";}
}
//echo $vent."<br>";

//RECUPERATION DES CHOIX DE LA LISTE HUM
$choix_hum = $_POST['hum'];
$hum = "";
for ($i=0; $i<count($choix_hum); $i++) {
	if ($i==count($choix_hum)-1) {$hum=$hum."$choix_hum[$i],";} else {$hum=$hum."$choix_hum[$i],";}
}
//echo $hum."<br>";

//RECUPERATION DES CHOIX DE LA LISTE INSTANT
$choix_instant = $_POST['instant'];
$instant = "";
for ($i=0; $i<count($choix_instant); $i++) {
	if ($i==count($choix_instant)-1) {$instant=$instant."$choix_instant[$i],";} else {$instant=$instant."$choix_instant[$i],";}
}
//echo $instant."<br>";

//RECUPERATION DES CHOIX DE LA LISTE AUTRE
$choix_autre = $_POST['autre'];
$autre = "";
for ($i=0; $i<count($choix_autre); $i++) {
	if ($i==count($choix_autre)-1) {$autre=$autre."$choix_autre[$i],";} else {$autre=$autre."$choix_autre[$i],";}
}
//echo $autre."<br>";


//COMPTE LE NOMBRE DE PARAMETRES SELECTIONNES
$nb_param =2+count($choix_vent)+count($choix_hum)+count($choix_code)+count($choix_instant)+count($choix_autre)+count($choix_param);



$sql =$_POST['sql'];
$jour_debut = $_POST['jour_debut'];
$mois_debut = $_POST['mois_debut'];
$annee_debut = $_POST['annee_debut'];
$jour_fin = $_POST['jour_fin'];
$mois_fin = $_POST['mois_fin'];
$annee_fin = $_POST['annee_fin'];

$date_debut = $annee_debut."-".$mois_debut."-".$jour_debut;
$date_fin = $annee_fin."-".$mois_fin."-".$jour_fin;

$requete_code = ("SELECT * FROM t_aide_code_meteo WHERE attribut = ".$_POST['amp']."");


//echo $requete_code."<br>";

$requete = ("SELECT date_j,".$param.$vent.$hum.$code.$instant.$autre."id_mesure_journ FROM t_meteo_journaliere WHERE num_poste=".$num_poste." AND date_j BETWEEN '".$date_debut."' AND '".$date_fin."' ORDER BY date_j");

$query = pg_query($db,$requete) or die ("Echec sur pg_query".pg_last_error($db)."SELECT date_j,".$param.$vent.$hum.$code.$instant.$autre."id_mesure_journ FROM t_meteo_journaliere WHERE num_poste=".$num_poste." AND date_j BETWEEN '".$date_debut."' AND '".$date_fin."' ORDER BY date_j");;
//echo $requete."<br/>";
//echo "Nombre de parametres :".$nb_param;

//recuperation du nombre d'enregistrement de la requete
$nb_enreg = pg_num_rows($query);
//echo "<br/>Nombre de lignes : ".$nb_enreg."<br/>";

      if($fp = fopen("fichier_temp/".$fichier.".csv","a")){ //ouverture du fichier en ecriture 
fputs($fp, ereg_replace(",","\t","date_j,".$param.$vent.$hum.$code.$instant.$autre."id_mesure_journ\n"));
while ($tab=pg_fetch_array($query,NULL,PGSQL_BOTH)) 
{
	for ($i=0;$i<$nb_param;$i++) 
	{
		if ($i==$nb_param-1) {fputs($fp, "$tab[$i]");} else {fputs($fp, "$tab[$i]\t");}
	}
fputs($fp, "\n");
}

header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$fichier);
readfile("fichier_temp/".$fichier);

      fclose($fp);
//echo "ok";      
}else{ // L ouverture a echouee
      echo "Ouverture du fichier impossible";
      exit();
      }
?>

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

06 mars 2006, 13:52

fopen("fichier_temp/".$fichier.".csv","a"))
// ...
header("Content-Disposition: attachment; filename=".$fichier); 
readfile("fichier_temp/".$fichier); 
Il ne te manquerait pas l'extension dans le nom du fichier ? :)

Eléphanteau du PHP | 34 Messages

06 mars 2006, 14:22

Merci
Oui c'était bien cela, merci d'avoir trouvé moi j'étais parti sur quelque chose de plus compliqué alors que j'avais la solution sous mes yeux.
Merci encore d'avoir passé du temps dessus