Page 1 sur 1

Export de fichiers

Posté : 03 mars 2006, 16:41
par jduv
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
@+

Posté : 03 mars 2006, 16:45
par Hermès
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...

Posté : 03 mars 2006, 16:56
par jduv
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

Posté : 03 mars 2006, 17:22
par jduv
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 ??

Posté : 03 mars 2006, 17:40
par zeus
il te faut utiliser ces entetes là :
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$file);
readfile("files/".$file);

Posté : 06 mars 2006, 12:24
par jduv
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();
      }
?>

Posté : 06 mars 2006, 13:52
par Ryle
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 ? :)

Posté : 06 mars 2006, 14:22
par jduv
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