Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/11/2010, 17h26   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 8
Points : 0
Points : 0
Par défaut Problème telechargement fichier

Bonjour,

Je me permet de vous contactez car j'ai un soucis, je possède un serveur web et je voudrais faire l'upload et le download de fichier sur celui ci. Pour l'upload pas de problème je gère mais concernant le download je ne vois pas quel solution appliqué et ni comment faire, et après avoir parcouru ce forum et les tutos ce n'ais pas plu claire dans ma tete, je sais qu'il faut utilisé header et readfile.

En gros j'aurai voulu téléchargé un fichier image depuis mon serveur en cliquant sur un lien et en bonus si possible pouvoir envoyé ce lien par mail par exemple(mais bon ca attendra)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>	
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<title>Upload d'image en PHP</title>
	</head>
	<body>
 
<?php
 */
function get_extension($nom) {
    $nom = explode(".", $nom);
    $nb = count($nom);
    return strtolower($nom[$nb-1]);
}
 
 
$extensions_ok = array('jpg', 'jpeg');
 
$typeimages_ok = array(2);
 
$taille_ko = 250000; // Taille en kilo octect (ko)
$taille_max = $taille_ko*250000; // En octects
$dest_dossier = 'img/'; // Creez ce dossier et chmoodez le !
print_r($_FILES['photo']);
    if(isset($_FILES['photo'])) // Formulaire envoyé
    {
        // Les erreurs que PHP renvoi
        if($_FILES['photo']['error'] !== "0") {
                switch ($_FILES['photo']['error']) {
                case 1:
                    $erreurs[] = "Votre image doit faire moins de $taille_ko Ko !";
                    break;
                case 2:
                    $erreurs[] = "Votre image doit faire moins de $taille_ko Ko !";
                    break;
                case 3:
                    $erreurs[] = "L'image n'a été que partiellement téléchargé.";
                    break;
                case 4:
                    $erreurs[] = "Aucun fichier n'a été téléchargé.";
                    break; 
                case 6:
                    $erreur[] = "Un dossier temporaire est manquant.";
                    break;
                case 7:
                    $erreurs[] = "Échec de l'écriture du fichier sur le disque.";
                    break;
            }
        }
                if(!$getimagesize = getimagesize($_FILES['photo']['tmp_name'])) {
            $erreurs[] = "Le fichier n'est pas une image valide.";
        }
 
        if( (!in_array( get_extension($_FILES['photo']['name']), $extensions_ok ))
           or (!in_array($getimagesize[2], $typeimages_ok )))
        {
            foreach($extensions_ok as $text) { $extensions_string .= $text.', '; }
            $erreurs[] = 'Veuillez sélectionner un fichier de type '.substr($extensions_string, 0, -2).' !';
        }
 
        if( file_exists($_FILES['photo']['tmp_name']) 
                  and filesize($_FILES['photo']['tmp_name']) > $taille_max)
        {
            $erreurs[] = "Votre fichier doit faire moins de $taille_ko Ko !";
        }
 
 
        if(!isset($erreurs) or empty($erreurs))
        {
            $dest_fichier = basename($_FILES['photo']['name']);
            $dest_fichier = strtr($dest_fichier, 'ÀÃÂÃÄÅÇÈÉÊËÌÃÃŽÃÒÓÔÕÖÙÚÛÜÃà áâãäåçèéêëìÃ*îïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
 
            $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
 
 
            while(file_exists($dest_dossier . $dest_fichier)) {
                $dest_fichier = rand().$dest_fichier;
            }
 
 
            if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier)) {
                $valid[] = "Image uploadé avec succés (<a href='".$dest_dossier . $dest_fichier."'>Voir</a>)";
            } else {
                $erreurs[] = "Impossible d'uploader le fichier.<br />Veuillez vérifier que le dossier ".$dest_dossier." existe avec un chmod 755 (ou 777).";
            }
        }
    }
?>
 
<form method="POST" action="" enctype="multipart/form-data">
<?php
if(!empty($erreurs)) {
    echo '<ul class="erreur">';
    foreach($erreurs as $erreur) {
        echo '<li>'.$erreur.'</li>';
    }
    echo '</ul>';
}
if(!empty($valid)) {
    echo '<ul class="validation">';
    foreach($valid as $text) {
        echo '<li>'.$text.'</li>';
    }
    echo '</ul>';
}
 
?>
    <fieldset>
    <legend>Envoi d'image</legend>
        <p>
            <label for="photo">Image : </label>
            <input type="file" name="photo" id="photo" />
        </p>
        <p>
            <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $taille_max; ?>" />
            <input type="submit" name="envoi" value="Envoyer l'image" />
        </p>
    </fieldset>
</form>
Et voici le second code pour la gestion des images ou j'aurai bien voulu inséré le lien de télechargement sous forme de liste comme pour la suppression.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
$adresse = "./img/"; //Adresse du dossier.
if(isset($_GET['nom'])) //Si $_GET['nom'] existe, on supprime le fichier...
{
     if ($Fichier != "." && $Fichier != "..") 
     {
          $nom=''.$adresse.$_GET['nom'].'';
          unlink($nom);
          echo 'Le fichier "'.$_GET['nom'].'" a été éffacé !<br>';
     }
} 
$dossier = opendir($adresse); //Ouverture du dossier. 
echo '<fieldset><legend>Liste des fichiers</legend><br>'; //Ouverture de fieldset 
while ($Fichier = readdir($dossier)) //Affichage...
{  
     if ($Fichier != "." && $Fichier != "..") 
     { 
          echo '<a href="gestionfich.php?nom='.$Fichier.'">Supprimer</a> => <a href='.$adresse.$Fichier.' target="_blank">'.$Fichier.'</a><BR>'; 
          echo '<a href="gestionfich.php?nom='.$Fichier.'">Telecharger</a> => <a href='.$adresse.$Fichier.' target="_blank">'.$Fichier.'</a><BR>';
     }
}
closedir($dossier); 
echo '<br></fieldset>'; 
?>
Je requiert votre aide car je suis completement perdu.
x333xx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 20h34   #2
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Euh... pourquoi tu ne fais pas un lien vers le fichier simplement ?
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2010, 23h04   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 8
Points : 0
Points : 0
J'y ais pensé, meme lorsque je donne le lien mon navigateur l'interprète en ouvrant un nouvel onglet au lieu de la telechargé
x333xx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 23h08   #4
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Ah tu veux forcer le téléchargement sans que l'utilisateur n'ait à faire click droit et enregistrer sous ?

Un truc genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<?php
$file=$_GET['file'];
 
if (($file != "") && (file_exists("./" . basename($file)))) {
  $size = filesize("./" . basename($file));
  header("Content-Type: application/force-download; name=\"" . basename($file) . "\"");
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: $size");
  header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
  header("Expires: 0");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");
  readfile("./" . basename($file));
  exit();
}
?>
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2010, 23h17   #5
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
ahh tu veux utiliser l'entete HTTP Content-disposition.

soit tu es bon en .htaccess et tu dois pouvoir ajouter l'entete http via le .htaccess et tu continue à fournir le lien comme pour une image normale (et tu auras la gestion du cache en prime )

Le .htaccess reconnait expression régulière, donc si tu ne sais pas à l'avance le nom du fichier, un répertoire dédié est c'est joué.

soit tu codes le tout en php en utilisant ceci, puis tout ce qui va avec et qui est documenté partout sur le web et ici aussi ( readfile() et les entête supplementaire pour spécifier que c'est une image de taille prévisible et qu'elle peut ou pas être mise en cache )
Code :
header('Content-Disposition: attachment; filename="file.ext"');
Le seul avantage c'est que tu peux réutiliser cette solution pour tout type de fichier et de donnée indépendamment si la source des données est un vrai fichier dans l'arbo web ou un fichier temporaire ou une chaine de caractère dans le tmp de l'interpréteur php.

EDIT: pas répondu assez vite.


il va sans dire que je te recommande la solution 1, à l'exception IIS près...
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 10h41   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 8
Points : 0
Points : 0
Oui voila je voulais forcé le telechargement enfin dans le sens qu'il n'ais qu'a clique sur le lien pour telechargé (clique gauche), ta solution me plait bien Joker-eph.
Mais j'aurai une question, je stocke tout mes fichier dans un dossier ./img comment je fais pour le parcourir et ainsi crée des liens telechargeable pour tous les fichiers du dossier?
Et ainsi les affiché tous sous forme de liste comme mon code pour la suppression.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
$adresse = "./img/"; //Adresse du dossier.
if(isset($_GET['nom'])) //Si $_GET['nom'] existe, on supprime le fichier...
{
     if ($Fichier != "." && $Fichier != "..") 
     {
          $nom=''.$adresse.$_GET['nom'].'';
          unlink($nom);
          echo 'Le fichier "'.$_GET['nom'].'" a été éffacé !<br>';
     }
} 
$dossier = opendir($adresse); //Ouverture du dossier. 
echo '<fieldset><legend>Liste des fichiers</legend><br>'; //Ouverture de fieldset 
while ($Fichier = readdir($dossier)) //Affichage...
{  
     if ($Fichier != "." && $Fichier != "..") 
     { 
          echo '<a href="gestionfich.php?nom='.$Fichier.'">Supprimer</a> => <a href='.$adresse.$Fichier.' target="_blank">'.$Fichier.'</a><BR>'; 
 
     }
}
closedir($dossier); 
echo '<br></fieldset>'; 
?>
EDIT : gene69 ta solution est encore un peu trop compliqué pour moi ^^
x333xx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 18h18   #7
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Je ne comprends pas bien...
Tu fais exactement pareil que ton code de supression, mais au lieu de faire un unlink tu utilises le code que je t'ai fourni précédement non ?
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/11/2010, 22h34   #8
Invité de passage
 
Inscription : novembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 8
Points : 0
Points : 0
Merci, oui tu as raison j'ai fais mon noob comme un pigeon je cherchais a l'intégré dans mon while au lieu du premier if.

EDIT : ca marche

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?
$adresse = "./img/"; //Adresse du dossier.
 
if(isset($_GET['nom'])) //Si $_GET['nom'] existe, on supprime le fichier...
{
     if ($Fichier != "." && $Fichier != "..") 
     {
          $nom=''.$adresse.$_GET['nom'].'';
  header("Content-Type: application/force-download; name=\"" . basename($nom) . "\"");
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: $size");
  header("Content-Disposition: attachment; filename=\"" . basename($nom) . "\"");
  header("Expires: 0");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");
  readfile("./" . basename($nom));
  exit();
     }
 
}
 
$dossier = opendir($adresse); //Ouverture du dossier. 
echo '<fieldset><legend>Liste des fichiers</legend><br>'; //Ouverture de fieldset 
//(Fieldset permet de faire des cadres avec légende intégrée en haut a gauche. 
//C'est très simple à utiliser et ça permet de répartir les formulaires en plusieurs parties et donc d'accroître leur lisibilité !). 
while ($Fichier = readdir($dossier)) //Affichage...
{  
     if ($Fichier != "." && $Fichier != "..") 
     { 
          echo '<a href="download.php?nom='.$Fichier.'">telecharger</a> => <a href='.$adresse.$Fichier.' target="_blank">'.$Fichier.'</a><BR>'; 
 
     }
 
}
 
closedir($dossier); //Fermeture du dossier. 
echo '<br></fieldset>'; //Fermeture du fieldset.
?>
x333xx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h21.


 
 
 
 
Partenaires

Hébergement Web