Aller au contenu

Faire télécharger une image


Sujets conseillés

Posté

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

Posté

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 ?

Posté

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

Posté

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.

Veuillez vous connecter pour commenter

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



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