[php] télécharger via php

bonjour à tous,

je souhaiterais mettre sur mon site des fichiers en téléchargement, la problème, c’est que c’est des images en jpeg, mais je veux que lorsque le visiteur clique sur le lien, le navigateur lui propose de télécharger l’image, et non de l’afficher sur une page.

Je pense qu’il faut passer par un fichier download.php par exemple, mais je ne sait pas du tout quoi mettre dedans.

si un gentil membre pouvait m’éclairer :smiley:

merci d’évance :wink:

++ ISZ

On précise le mime-type en retour comme ne devant pas être interprété :

header("Content-Type : application/octet-stream")

On précise le nom à donner en sortie

header("Content-disposition: attachment; filename=XXX.jpg")

On trasfère le fichier

readfile("XXX.jpg")

C’est le strict minimum, c’est mieux en gérant un peu de sécurité et en définissant le Header content-Length :wink:

Je te propose une autre rapide solution plus détaillée. (reste a prendre en compte les conseil de myself)

    

$file_path = "images/$fichier"; //où $fichier est le nom de ton image

// contenu du fichier
$ofile = fopen ($file_path, 'r');
$content = fread($ofile, filesize($file_path));
fclose ($ofile);
//

//header
header('Content-Type: images/jpg');
header("Content-Disposition: attachment; filename=$fichier");

//envoi du fichier au navigateur
echo $content;


@Myself :

header(“Content-Type : application/octet-stream”) est bien géré sous ie et firefox, sous opera 9, il y a un bug d’interprétation l’image devient un fichier avec extension html. La solution consite a fournir un “Content-Type: images/jpg” non défini mais qui produit le resultat escompté sur tout les navigateurs

avec ce script j’ai une erreur mysql sur la ligne

header("Content-disposition: attachment; filename=XXX.jpg")

et avec

$file_path = "images/$fichier"; //où $fichier est le nom de ton image

// contenu du fichier
$ofile = fopen ($file_path, 'r');
$content = fread($ofile, filesize($file_path));
fclose ($ofile);
//

//header
header('Content-Type: images/jpg');
header("Content-Disposition: attachment; filename=$fichier");

//envoi du fichier au navigateur
echo $content;

au lieu de me proposer de télécharger l’image, ça me propose de télécharger le fichier php :confused: sachant que mon image est définie par la variable $read[4] (chemin depuis la racine inclus dans la variable) et le fichier doit s’appeller “ISZ-concours_$read[0].JPG” (je ne sait pas si c’est possible de le nommer comme ça :??: )

Merci d’avance,
ISZ

Peut etre as tu oublié les ";" a la fin de chaque ligne.

Pour mon script, obtient tu une erreur affichée ou pas ?

Pour le nom de ton fichier je ne pense pas que ce soit le plus conseillé, en effet $read[0] va etre interprété et ca va merdoyer car je pense que elle aussi contient des caractères qui ne doivent pas se trouver dans un nom de fichier (genre /).

Que contient read[0] en réalité et pourquoi veut tu l’inserer dans ton nom de fichier (id unique ?)

non je n’ai pas oublié les points-virgule :wink:

read[0] contient l’id de la rubrique (qui a une durée limitée) à laquelle l’image est associée. Lorsque je mets ma rubrique à jour, je change cette id, et mon image prends le nom de cette id (d’ou read[4], le chemin de l’image en vigueur au moment du clic, chemin modifié régulièrement via la commande UPDATE de ma base de données). read[0] est donc l’id de la rubrique, et il faut que l’image ainsi téléchargée contienne le nom de la rubrique en vigueur, donc j’ai pensé à mettre $read[0] dans le nom… ça a l’air compliqué, mais si on ne peut pas placer cette variable dans le nom, existe-t-il un autre moyen d’insérer ma variable d’id de cette manière dans le nom final du fichier, ou simplement de laisser le nom actuel de l’image (qui est déja read[0]…) ?

Ok. Alors oui il est possible de mettre ton id sans probleme.

Je te conseillerai la synthaxe suivante :


$fichier_nom = "ISZ-concours_".$read[0].".jpg";
header("Content-Disposition: attachment; filename=$fichier_nom");

ok j’essaye ça tout de suite :wink:

[edit] je viens de tester avec ce que tu viens de me proposer, mais ça me fais toujours la proposition d’enregistrer download.php… tu vois pas d’ou ça peut venir ? ma page est ainsi :


<?php
$connexion=mysql_connect("CHEMIN SQL HEBERGEUR","LOGIN BDD","PASS BDD") or die (Mysql_error());
$db=mysql_select_db("insiderz_1",$connexion) or die (Mysql_error()); // insiderz_1 est le nom de la base
$query = "SELECT * FROM progconcoursvt"; // progconcoursvt est le champ dans lequel sont stockés l'id et le chemin de l'image (read[0] et [4])
$result = mysql_query($query) or die(mysql_error());

$file_path = $read[4]; //chemin du fichier

$ofile = fopen ($file_path, 'r');
$content = fread($ofile, filesize($file_path));
fclose ($ofile);

header('Content-Type: images/jpg');
$fichier_nom = "ISZ-concours_".$read[0].".jpg";
header("Content-Disposition: attachment; filename=$fichier_nom");

echo $content;
 ?>

Peux tu vérifier le contenu de $read[4] ? En effet je ne vois pas ou tu définis ton tableau dans le code ci dessus. Un oubli ?

Sinon si tu a oubliés un bout de code, je ne vois aps ou peux se situer l’erreur, le script marche chez moi sous ie opera et ff.

SI tu veux le tester comme je te l’ai donné tu peux aller ici :

http://www.etherdev.info/www/album.art/

ensuite "collection", choisit une collection, choisi une photo, tu a téléchargeemnt en bas.

C’est le meme script que j’ai fait pour mon projet, donc si cela ne marche pas, tient moi au courant. Si ton navigateur te propose de telecharger une image jpeg, c’est que ce ça devrait marcher :slight_smile: Dans ce cas il faudrait que tu vérifies a chaque ligne si l’execution attendue c’est produite

VOila le code source de la fonction sur mon site telle que je l’ai faite :



$filename = "user/img/collection/".$_GET["id_collection"]."/".$_GET["img_filename"];
    // contenu du fichier
    $ofile = fopen ($filename, 'r');
    $content = fread($ofile, filesize($filename));
    fclose ($ofile);
    $filename = $_GET["img_filename"];
    header('Content-Type: images/jpg');
    header("Content-Disposition: attachment; filename=$filename");
    // envoi du fichier au navigateur
    echo $content;    

$read[4] contient le lien vers limage, sous la forme modules/concoursvt/bases/01.jpg
donc je pense que c’est bon… sinon j’utiliserais read[0] pour ici aussi, juste apres bases/, comme pour nommer le fichier final…

qu’appelle tu définir mon tableau au juste ? tu veut dire utiliser un while ? :??:

Bah le probleme c’est que dans le code que tu m’a donné, si il est complet bien entendu, ou est ce que le tableau $read est rempli ?

Pour vérifier écris apres cette ligne :

$file_path = $read[4]; //chemin du fichier
$file_path = $read[4]; //chemin du fichier
echo $read[4];

Ouvre ta page dans ton navigateur et regarde si il t’affiche le bon chemin d’accès
As tu essayé mon lien, l’image se télécharge t’elle ?

Je te corrige ton code par rapport au infos que tu m’a donné, test le :


<?php
$connexion=mysql_connect("CHEMIN SQL HEBERGEUR","LOGIN BDD","PASS BDD") or die (Mysql_error());
$db=mysql_select_db("insiderz_1",$connexion) or die (Mysql_error()); // insiderz_1 est le nom de la base
$query = "SELECT * FROM `progconcoursvt`"; // progconcoursvt est le champ dans lequel sont stockés l'id et le chemin de l'image (read[0] et [4])
$result = mysql_query($query) or die(mysql_error());

//Ajout. Attention je suppose que la table progconcoursvt ne comporte que le champ id en premiere position et le chemin de l'image en second.

list($read[0],$read[4])=mysql_fetch_array($result);
//debug
echo $read[0];
echo $read[4];
//Fin ajout


$file_path = $read[4]; //chemin du fichier

$ofile = fopen ($file_path, 'r');
$content = fread($ofile, filesize($file_path));
fclose ($ofile);

header('Content-Type: images/jpg');
$fichier_nom = "ISZ-concours_".$read[0].".jpg";
header("Content-Disposition: attachment; filename=$fichier_nom");

echo $content;
?>

ok j’essaye ça :wink:

pour ton site, j’ai regardé et ça se télécharge bien :wink:

je vois que tu as éditer pendant que j’écrivais…

nom ma table comporte plusieurs champ (read 0 est le 1er, et donc read 4 le 5eme). Il y a en tout 6 champs dedans. ça gêne beaucoup ? :confused:

J’ai fait un edit au dessus a cette ligne :

$query = "SELECT * FROM `progconcoursvt`"; // progconcoursvt est le champ dans lequel sont stockés l'id et le chemin de l'image

le code au dessud est a jour

j’ai édité mon message au dessus moi aussi, avant de voir le tien :wink:

ca gene beaucoup oui : )

Mais c’est simple a corriger :

tu modifie cette ligne :


//Remplace nom_id par le nom de la colonne de ta base sql contenant l'id et nom_chemin par celui de la colonne qui contient le chemin

$query = "SELECT `nom_id`, `nom_chemin` FROM `progconcoursvt`"

tu veut surement dire le nom du champ ?

oui exactement : )

bon, j’ai donc ça :

<?php
$connexion=mysql_connect("SQL HERBERG","LOGIN","PASS") or die (Mysql_error());
$db=mysql_select_db("insiderz_1",$connexion) or die (Mysql_error()); // insiderz_1 est le nom de la base
$query = "SELECT `numero`, `lienbase` FROM `progconcoursvt`"; // ligne modifiée;)
$result = mysql_query($query) or die(mysql_error());

//Ajout. Attention je suppose que la table progconcoursvt ne comporte que le champ id en premiere position et le chemin de l'image en second.

list($read[0],$read[4])=mysql_fetch_array($result);
//debug
echo $read[0];
echo $read[4];
//Fin ajout


$file_path = $read[4]; //chemin du fichier

$ofile = fopen ($file_path, 'r');
$content = fread($ofile, filesize($file_path));
fclose ($ofile);

header('Content-Type: images/jpg');
$fichier_nom = "ISZ-concours_".$read[0].".jpg";
header("Content-Disposition: attachment; filename=$fichier_nom");

echo $content;
?>

Mais ça me propose toujours de télécharger mon fichier php… :confused:
ça peut pas venir du lien de l’image vers mon fichier ? moi j’ai mis un lien tout simple, sans option ni valeur ni rien après… tu clic sur l’image et elle mène à download.php :confused:

On va y arriver : )

Tu a deux instructions echo en dessosu du commentaire //debug qui devrait afficher sur ta page leur contenu

  • SI tu vois une page blanche, c’est que elle n’ont pas été remplises : )
    SInon tu peux controler si ce qu’elles contiennent est juste (c a d une id et un chemin)

Dans le cas ou tu n’a l’affichage de rien, le probleme se trouve dans la récupration a partir de la base de donnée.

On va tester si il y a au moins un enregistrement.

<?php
$connexion=mysql_connect("SQL HERBERG","LOGIN","PASS") or die (Mysql_error());
$nb=0;
$db=mysql_select_db("insiderz_1",$connexion) or die (Mysql_error()); // insiderz_1 est le nom de la base
$query = "SELECT COUNT(*) FROM `progconcoursvt`";
$result = mysql_query($query);

list($nb)=mysql_fetch_array($result);
echo $nb;


?>

Ca t’affiche comien d’enregistrement?

il m’affiche 1 (comme prévu, puisqu’il n’y en aura jamais plus d’un :D)