Aller au contenu

Faire télécharger une image


TYBMHI

Sujets conseillés

Bonjour à tout le monde

Sur mon site j'ai mis en place des fonds écrans. Donc j'affiche une petite miniature avec en dessous le lien "télécharger" . Ça marche super bien sur firefox. Sur IE ça ouvre la fenêtre qui demande de télécharger, on valide mais ça ne télécharge que 0 octet et donc le fichier téléchargé est inexploitable.

voici le lien :

<a href="envoi_image.php?filename=http://www.monsite.net/telecharger/fondecran/1024x768/fondecran1p.jpg"> télécharger</a>

voici le fichier envoi_image.php :

<?php
if (isset($_GET["filename"]))
{
$filename=$_GET["filename"];
// ne conserver que le nom du fichier : le nom que verra s'afficher l'utilisateur
$uploadname=basename($filename);

// Envoi du fichier
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream');
header('Content-Disposition: attachment; filename="'.$uploadname.'"');
header('Content-length: '.filesize($filename));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
readfile($filename) OR die();
}
?>

Merci pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

Hello,

essaye d'enlever le Content-length éventuellement. Pour peu que la compression soit activée, l'info est fausse.

Sinon plusieurs trucs me gênent :

- pourquoi utilises tu une adresse en &quot;http://" pour pointer l'image local ? Tu cherches à saturer le plus vite possible ton serveur Apache ?

- si je remplace ce paramètre filename par le nom de ton fichier de config, je vais aussi récupérer tes identifiants d'accès MySQL, rigolo non ?

- pourquoi diable désactiver toute mise en cache ? Surtout pour un site de fond d'écran où la bande passante est souvent un problème.

- sur tes entêtes, tu mets un domaine "no-cache" et la ligne d'après tu le remplaces par un domaine "public"... tu veux lequel en fait ?

Lien vers le commentaire
Partager sur d’autres sites

Je te remercie de ton aide. J'ai retirer le Content-length et maintenant ca marche nikel.

Pour tout le reste, si tu as des améliorations à faire au script je suis preneur car je débute en PHP. Encore merci

Lien vers le commentaire
Partager sur d’autres sites

Déjà pas besoin du &quot;http://" dans les liens :

<a href="envoi_image.php?filename=1024x768/fondecran1p.jpg"> télécharger</a>

Ensuite du coté du script d'envoi, il faut un minimum de vérification pour s'assurer qu'il s'agisse bien d'un fichier autorisé :

<?php
$error = false;
if(!isset( $_GET['filename'] ) )
$error = true;
else {
$filename = $_GET['filename'];
$basename = basename( $_GET['filename'] );
$dirname = dirname( $_GET['filename'] );

$dossiersAuthorises = array( '1024x768', '800x600', '[a completer]' );
if(!in_array( $dirname, $dossiersAuthorises ) )
$error = true;

$filename = '/chemin/a/completer/' . $dirname .'/'. $basename;
}
if($error){
echo "grosse erreur !!!!";
exit;
}

//header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream');
header('Content-Disposition: attachment; filename="'.$basename.'"');
header("Cache-Control: must-revalidate, public, max-age=7200");
header("Pragma: public");
header("Expires: 7200");
readfile($filename);

Le header que j'ai mis en commentaire, c'est juste parce que de tête je ne me soucis pas de son utilité. Donc à vérifier.

Pour le cache, il n'y a aucune gestion ici, si ce n'est un mini "expires" de 2 heures.

Mais il me semble en avoir déjà discuté sur ce forum, si tu fais une recherche sur ETag ou Last-Modification tu devrais retrouver le sujet en question.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...