IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème telechargement fichier


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Euh... pourquoi tu ne fais pas un lien vers le fichier simplement ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 8
    Par défaut
    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é

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Ah tu veux forcer le téléchargement sans que l'utilisateur n'ait à faire click droit et enregistrer sous ?

    Un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    }
    ?>

  5. #5
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    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 : 1 769
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ^^

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    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 ?

Discussions similaires

  1. [AJAX] [STRUTS] Telechargement fichier
    Par CuBiS dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/07/2007, 12h01
  2. [Servlet] Probléme écriture fichier
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2005, 15h17
  3. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  4. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  5. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo