Header et base de donnée : d'ou vient le problème ?

S
Sylboss
Guest
Bonjours !

Le titre n'est peut-être pas très clair, mais je vais essayer de bien vous expliquer mon problème dans ce message :

J'ai un site qui propse des téléchargements, dont des vidéos et des PPS... or, quand quelqu'un veut télécharger un PPS ou une vidéo, il doit faire clique droit, puis enregistrer sous, ce qui est un peu chiant ! (A ce qu'il parait, certaines personne n'ont pas besoin de faire clique droit puis enregistrer sous... mais pour la majoité des personnes que je connai, il faut le faire...).

Donc, je veux que mon fichier se télécharge avec un lien hypertexte, directement du clique droit, à l'aide de la fonction header :

Le lien serait :

Code:
<a href="pps_download.php" class="texte">Chatmoura&iuml; !</a>

Ce qui donnerai un lien avec écrit "Chatmouraï !" qui enverrai sur la page pps_download.php.

La page pps_download.php serait :

Code:
<?php 
// Le chemin du fichier 
$fichier = 'pps/chatmourai.pps'; 
// L'en-tête avec le type erroné 
header('Content-type: application/blabla'); 
// Un en-tête pour dire qu'on souhaite que le fichier soit téléchargé et dont on propose un nom 
header('Content-Disposition: attachment; filename="' . basename($fichier) . '"'); 
// On envoie réellement le fichier 
readfile($fichier); 
?>

Voilà, jusqu'ici, pas de problème...

Le problème, c'est que mon site contient pour l'instant 46 PPS et 36 vidéos, ce qui ferait un total de 82 pages à faire ! ... et donc là, il y a un problème.

J'ai alors demandé à quelqu'un si je pouvai faire quelque chose pour ne pas avoir tant de page à faire (surtout qu'a chaque fois que j'ajouterai un PPS ou une vidéo, il faudrai que je fasse une autre page !)

On m'a alors dit de paramétrer la page, et on m'a donné ce code :

Code:
<?php 
// Connexion DB 
// Requête : mysql_query(sprintf('SELECT fichier FROM table WHERE id=%d', $_GET['id'])); 
// Récupération dans $fichier du résultat de la requête. 

// L'en-tête avec le type erroné 
header('Content-type: application/octetstream'); 
// Un en-tête pour dire qu'on souhaite que le fichier soit téléchargé et dont on propose un nom 
header('Content-Disposition: attachment; filename="' . basename($fichier) . '"'); 
// On envoie réellement le fichier 
readfile($fichier); 
?>

Et on m'a dit qu'il faudrai faire le lien suivant :

Code:
<a href="download.php?id=4654645">Lien vers Fichiers</a>

Et c'est là que sa bloque :

Admettons que pour le lien, je mette :
Code:
<a href="pps_download.php?id=1">Chamourai !</a>

J'ai paramétrer la page pps_download :
Code:
<?php 
// Connexion DB 
// Requête : mysql_query(sprintf('SELECT champ,champ FROM table WHERE id=%d', $_GET['id'])); 
// Récupération dans $fichier du résultat de la requête. 

$server = 'sql.free.fr';
$user = 'sylboss';
$password = 'password';
$database = 'sylboss';

mysql_connect($server,$user,$password) or die('Erreur de connexion');  
mysql_select_db($database) or die('Base inexistante');  
$fichier = mysql_query(sprintf('SELECT nom FROM pps WHERE id=%d', $_GET['id'])); 
mysql_close();  

// L'en-tête avec le type erroné
header('Content-type: application/octetstream'); 
// Un en-tête pour dire qu'on souhaite que le fichier soit téléchargé et dont on propose un nom 
header('Content-Disposition: attachment; filename="' . basename($fichier) . '"'); 
// On envoie réellement le fichier 
readfile($fichier); 
?>

(Bien sur, mon mot de passe n'est pas password, mais je n'allais pas vous le dire !).

Et là, ça ne marche pas ! ... donc, ben je ne sais pas quoi faire, je ne sais pas d'où vient le problème, j'ai beau lire des doc et tuto, rien à faire, je sais pas d'ou vient le problème !

D'ou vient il ? Du script qui n'est pas bon (alors que dois-je changer !!!)
De ma base de donnée ? (si le script vous parait bon, c'est que le problème vient de là !
D'autre part ou des deux, mais là, je suis vraiment nul !

Je comprendrez mieux avec un exemple, clair et compréhensible (quand il y a pas de code, je galère énormement pour comprendre !).

... il faut dire aussi que je suis débutant, ça fait 2 mois que je me suis mis au php, et encore, c'était juste pour faire un include ! donc, j'aurai besoin d'aide mais de préférence pas trop compliqué pour un débutant !

J'espère que j'ai été assez clair dans ce message !
J'attend vos réponses avec impatience !

Merci d'avance !

Sylboss

PS : Quand je dis débutant, c'est aussi que j'ai un site depuis 1 ans, et que j'ai moi même 14 ans... donc, ne vous étonnez pas si je ne vous comprend pas très bien ![/code]
 
WRInaute impliqué
Code:
<?php 
// Connexion DB 
// Requête : mysql_query(sprintf('SELECT champ,champ FROM table WHERE id=%d', $_GET['id'])); 
// Récupération dans $fichier du résultat de la requête. 

$server = 'sql.free.fr';
$user = 'sylboss';
$password = 'password';
$database = 'sylboss';

mysql_connect($server,$user,$password) or die('Erreur de connexion');  
mysql_select_db($database) or die('Base inexistante');

$result = mysql_query(sprintf('SELECT nom FROM pps WHERE id=%d', $_GET['id']));
$fields = mysql_fetch_array( $result );
$fichier = $fields['nom'];
mysql_close();

Code:
// L'en-tête avec le type erroné
header('Content-type: application/octetstream'); 
// Un en-tête pour dire qu'on souhaite que le fichier soit téléchargé et dont on propose un nom 
header('Content-Disposition: attachment; filename="' . basename($fichier) . '"'); 
// On envoie réellement le fichier 
readfile($fichier); 
?>

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

Attention car si tes fichiers sont trop volumineux, ça ne passera pas ( timeout du script PHP )

PS: Si pour certains, les fichiers s'ouvrent directement, c'est qu'ils l'ont configuré quelque part.
 
B
Bernard
Guest
pour les tailles trop importantes , il faut je crois modifier MAX FILE SIZE dans php.ini
 
WRInaute impliqué
Bernard a dit:
pour les tailles trop importantes , il faut je crois mofifie rMAX FILE SSIZE da

Ca c'est pour l'upload. Le problème peut venir du temps d'exécution du script qui est limité ( et même très limité chez free )
 
S
Sylboss
Guest
Merci beacoup, j'étais coincé pendant 2 jours et grâce à vous je suis plus coincé !

Voilà, et si ça peu aidé quelqu'un, pour que le script marche, il faut remplacer le :
header("Content-Disposition: attachment; filename=".$fichier);
par un
header('Content-Disposition: attachment; filename="' . basename($fichier) . '"');

Voilà, et encore merci à vous !

Sylboss
 
Discussions similaires
Haut