Téléchargement en php

Blast0Kd

Blast0Kd Le 14 mai 2016 à 17:18 (Édité le 25 janvier 2019 à 17:51)

Salut à tous, je voudrais qu'un fichier se télécharge après une requête PHP vérifié,
merci de vos réponse
TheOldNoob

TheOldNoob Le 14 mai 2016 à 19:38 (Édité le 14 mai 2016 à 19:39)

Salut l'ami !

Comme je suis sympas, je te met le code complet d'une page avec upload d'un avatar, sur la page d'édition d'un profile. (mais ça marche aussi pour n'importe quel fichier). Tudevra l'adapté sur ta page et a rajouter les type MIME qui t'interesse 😀


<?php
// connection à la base
require_once 'inc/connect.php';

$post = array();
$error = array();

$errorUpdate  = false; // erreur lors de la mise à jour de la table
$displayErr   = false; 
$formValid    = false;
$userExist    = false;

$folder = 'avatar/'; // création de la variable indiquant le chemin du répertoire destination pour les fichiers uploadés (important  : le slash à la fin de la chaine de caractère).
$maxSize = 1000000 * 5; // 5Mo


// vérification des paramètres GET et appel des champs user correspondants
if(isset($_GET['id']) AND !empty($_GET['id']) AND is_numeric($_GET['id'])) {

    $idUser = intval($_GET['id']);

    // Prépare et execute la requète SQL pour récuperer notre user de manière dynamique
    $req = $bdd->prepare('SELECT * FROM users WHERE id = :idUser');
    $req->bindParam(':idUser', $idUser, PDO::PARAM_INT);
    if($req->execute()) {
        // $editUser contient mon utilisateur extrait de la bdd
        $editUser = $req->fetch(PDO::FETCH_ASSOC);
        if(!empty($editUser) && is_array($editUser)){ // Ici l'utilisateur existe donc on fait le traitement nécessaire
            $userExist = true; // Mon user existe.. donc bon paramètre GET et requête SQL ok

            // Si l'utilsateur existe, j'instancie la variable $idAvatar qui me permet de stcocker l'id user dans le nom du fichier
            $idAvatar = $editUser['id'];
        }
    }
}

//var_dump($_FILES);

// UPLOAD DE FICHIER : Contrôle de l'upload de fichier et de la supergloable $_FILES
if(!empty($_FILES) && isset($_FILES['picture'])) {

    if ($_FILES['picture']['error'] == UPLOAD_ERR_OK AND $_FILES['picture']['size'] <= $maxSize) {

        $nomFichier = $_FILES['picture']['name']; // récupère le nom de mon fichier au sein de la superglobale $_FILES (tableau multi-dimentionnel)
        $tmpFichier = $_FILES['picture']['tmp_name']; // Stockage temporaire du fichier au sein de la superglobale $_FILES (tableau multi-dimentionnel)
        
        
        /* CONTROLE DU TYPE MIME
        *  $file = new finfo(); // Classe FileInfo
           $mimeType = $file->file($_FILES['image']['tmp_name'], FILEINFO_MIME_TYPE); // Retourne le VRAI mimeType

        *
        *
        *
        */

        $file = new finfo(); // Classe FileInfo
        $mimeType = $file->file($_FILES['picture']['tmp_name'], FILEINFO_MIME_TYPE); // Retourne le VRAI mimeType

        $mimTypeOK = array('image/jpeg', 'image/jpg', 'image/png', 'image/gif');

        if (in_array($mimeType, $mimTypeOK)) { // in_array() permet de tester si la valeur de $mimeType est contenue dans le tableau $mimTypeOK
                    
           /* CHANGER LE NOM DU FICHIER PAR MESURE DE SECURITE
            * explode() permet de séparer une chaine de caractère en un tableau
            * Ici on aura donc : 
            *                   $newFileName  = array(
                                                    0 => 'nom-de-mon-fichier',
                                                    1 => '.jpg'
                                                );
            */
            $newFileName = explode('.', $nomFichier);
            $fileExtension = end($newFileName); // Récupère la dernière entrée du tableau (créé avec explode) soit l'extension du fichier

            // nom du fichier avatar au format : user-id-timestamp.jpg
            $finalFileName = 'user-'.$idAvatar.'-'.time().'.'.$fileExtension; // Le nom du fichier sera donc user-id-timestamp.jpg (time() retourne un timsestamp à la seconde)



                if(move_uploaded_file($tmpFichier, $folder.$finalFileName)) { // move_uploaded_file()  retourne un booleen (true si le fichier a été envoyé et false si il y a une erreur)
                    // Ici je suis sur que mon image est au bon endroit
                    $dirAvatar = $folder.$finalFileName;
                    
                    $success = 'Votre fichier a été uplaodé avec succés !';
                    $showSuccess = true;
                }
                else {
                    // Permet d'assigner un avatar par defaut
                    $dirAvatar = "avatar/avatar-default.jpg";
                }
        } // if (in_array($mimeType, $mimTypeOK))

        else {
            $error[] = 'Le type de fichier est interdit mime type incorrect !';
        } 


    } // end if ($_FILES['picture']['error'] == UPLOAD_ERR_OK AND $_FILES['picture']['size'] <= $maxSize)
    else {
        $error[] = 'Merci de chosir un fichier image (uniquement au format jpg) à uploader et ne dépassant pas 5Mo !';
    }
} // end if (!empty($_FILES) AND isset($_FILES['picture'])

else {
    // Permet d'assigner l'avatar par defaut si l'utilisateur n'en a aucun
    $dirAvatar = "avatar/avatar-default.jpg";
}


// Si le formulaire est soumis et que $userExist est vrai (donc qu'on a un utilisateur)
if(!empty($_POST) && $userExist == true) {
    foreach($_POST as $key => $value) {
        $post[$key] = trim(strip_tags($value));
    }

    if(empty($post['nickname']) OR strlen($post['nickname']) < 2) {
        $error[] = 'Votre prénom doit comporter au moins 2 caractères';
    }

    if(empty($post['lastname']) OR strlen($post['lastname']) < 2) {
        $error[] = 'Votre prénom doit comporter au moins 2 caractères';
    }

    if(empty($post['firstname']) OR strlen($post['firstname']) < 2) {
        $error[] = 'Votre prénom doit comporter au moins 2 caractères';
    }

    if (!filter_var($post['email'], FILTER_VALIDATE_EMAIL)) {
        $error[] = 'Votre adresse mail n\'est pas au bon format';
    }

    if(count($error) > 0) {
        $displayErr = true;
    }
    else {

        //var_dump($post);

        // insertion de la news dans la table "news"
        $upd = $bdd->prepare('UPDATE users SET nickname = 😋seudoUser, firstname = 😋renomUser, lastname = :nomUser, email = :emailUser, avatar = :avatarUser WHERE id = :idUser');

        // On assigne les valeurs associées au champs de la table (au dessus) aux valeurs du formulaire
        // On passe l'id de l'article pour ne mettre à jour que l'article en cours d'édition (clause WHERE).
        $upd->bindValue(':idUser',     $idUser,            PDO::PARAM_INT);
        $upd->bindValue(':pseudoUser', $post['nickname'],  PDO::PARAM_STR);
        $upd->bindValue(':prenomUser', $post['firstname'], PDO::PARAM_STR);
        $upd->bindValue(':nomUser',    $post['lastname'],  PDO::PARAM_STR);
        $upd->bindValue(':emailUser',  $post['email'],     PDO::PARAM_STR);
        $upd->bindValue(':avatarUser', $dirAvatar,         PDO::PARAM_STR);
    
        // Vue que la fonction "execute" retourne un booleen on peut si nécéssaire le mettre dans un if
        if($upd->execute()) { // execute : retourne un booleen -> true si pas de problème, false si souci.
            $formValid    = true;
            // On refait le SELECT pour afficher les infos à jour dans le formulaire
            // Puisque le premier SELECT est avant l'UPDATE
            $req = $bdd->prepare('SELECT * FROM users WHERE id = :idUser');
            $req->bindParam(':idUser', $idUser, PDO::PARAM_INT);
            if($req->execute()) {
            // $editUser contient mon utilisateur extrait de la bdd
                $editUser = $req->fetch(PDO::FETCH_ASSOC);
            }
        }
        else {
            $errorUpdate  = true; // Permettre d'afficher l'erreur
        }

    }
}
?>
<?php include_once 'inc/header.php' ;?>
    

    <div id="page-content-wrapper">
            <div class="container-fluid">
        


                <?php if($userExist == false): ?>
                <div clas="col-md-12">   
                <!-- message d'erreur si problème url -->
                    <div class="alert alert-danger" role="alert">
                        <i class="fa fa-times fa-2x" aria-hidden="true"></i> Vous devez choisir un utilisateur avant de le modifier
                    </div>
                    <a class="btn btn-default btn-md" href="members.php" role="button">Liste des membres</a>
                </div>
                <?php endif; ?>
                
                <?php if($errorUpdate): ?>
                <div clas="col-md-12">   
                <!-- message d'erreur si problème url -->
                    <div class="alert alert-danger" role="alert">
                        <i class="fa fa-times fa-2x" aria-hidden="true"></i> Problème lors de la mise à jour de votre profil ! <br /> <?php //echo print_r($res->errorInfo()); ?>
                    </div>
                    <a class="btn btn-default btn-md" href="index.php" role="button">Page d'accueil</a>
                </div>
                <?php endif; ?>


                <?php if($displayErr): ?>
                <!-- affichage du tableau d'erreur $error si le formulaire est mal renseigné -->
                <div clas="col-md-12">
                    <div class="alert alert-danger" role="alert">
                        <i class="fa fa-times fa-2x" aria-hidden="true"></i> <?php echo implode('<br> <i class="fa fa-times fa-2x" aria-hidden="true"></i> ', $error); ?>
                    </div>                    
                </div>
                <?php endif; ?>


                <?php if($formValid): ?>
                <!-- message de confirmation après une modification de news -->
                <div clas="col-md-12">
                    <h1>Modification du compte de <strong><?php echo $editUser['nickname']; ?></strong> effectuée</h1>
                    <div class="alert alert-success" role="alert">
                        <i class="fa fa-check fa-2x" aria-hidden="true"></i> Votre compte utilisateur a bien été modifié.
                    </div>
                    <a class="btn btn-default btn-md" href="index.php" role="button">Page d'accueil</a>
                </div>
                <?php endif; ?>


                <?php if($userExist == true): ?>
                <div class="row">
                    <div class="col-md-12">
                    <h1>Edition de l'utilisateur : <strong><?php echo $editUser['nickname']; ?></strong></h1>

                        <form class="form-horizontal" method="POST" enctype="multipart/form-data">
                            <fieldset>
                                <legend>Merci de renseigner les champs obligatoires ;-) </legend>

                                    <div class="form-group">
                                        <label class="col-md-2 control-label" for="nickname">Pseudo *</label>  
                                        <div class="col-md-10">

                                            <input id="nickname" name="nickname" type="text" class="form-control input-md" required="true" value="<?php echo $editUser['nickname']; ?>">
                                            <span class="help-block">Merci d'indiquer votre pseudo</span>  

                                        </div>
                                    </div><!--.form-group-->

                                
                                    <div class="form-group">
                                        <label class="col-md-2 control-label" for="firstname">Prénom *</label>  
                                        <div class="col-md-10">
                                            <input id="firstname" name="firstname" type="text" class="form-control input-md" required="true" value="<?php echo $editUser['firstname']; ?>">
                                            <span class="help-block">Merci d'indiquer votre prénom</span>  
                                        </div>
                                    </div><!--.form-group-->

                                    
                                    <div class="form-group">
                                        <label class="col-md-2 control-label" for="lastname">Nom *</label>  
                                        <div class="col-md-10">
                                            <input id="lastname" name="lastname" type="text" class="form-control input-md" required="true" value="<?php echo $editUser['lastname']; ?>">
                                            <span class="help-block">Merci d'indiquer votre nom</span>  
                                        </div>
                                    </div><!--.form-group-->

                                    
                                   <div class="form-group">
                                        <label class="col-md-2 control-label" for="email">Email *</label>  
                                        <div class="col-md-10">
                                            <input id="email" name="email" type="email" class="form-control input-md" required="true" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" required="true" value="<?php echo $editUser['email']; ?>">
                                            <span class="help-block">Merci d'indiquer votre email</span>  
                                        </div>
                                    </div><!--.form-group-->


                                    <div class="form-group">
                                        <label class="col-md-2 control-label" for="picture">Avatar</label>  
                                        <div class="col-md-10">
                                            <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $maxSize; ?>">
                                            <input id="picture" name="picture" type="file">
                                            <span class="help-block">Si vous souhaitez ajouter un avatar</span>  
                                        </div>
                                    </div><!--.form-group-->

                                    <div class="form-group">
                                        <label class="col-md-2 control-label" for="singlebutton"></label>
                                        <div class="col-md-10">
                                            <input type="hidden" name="id" value="<?php echo $editUser['id']; ?>">
                                            <button type="submit" id="singlebutton" name="singlebutton" class="btn btn-primary">Modifier</button> <a href="index.php" class="btn btn-default">Ne rien changer</a>
                                        </div>
                                    </div>
                            </fieldset>
                        </form>

                    </div>
                </div><!--row-->
            <?php endif; ?>

            </div><!--.container-fluid-->
        </div><!--#page-content-wrapper-->

    </div><!--#wrapper // start in sidebar.php -->

<?php include_once 'inc/footer.php' ;?>
Blast0Kd

Blast0Kd Le 14 mai 2016 à 20:43

Ok merci 
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte