[RESOLU] Upload de fichier ".pdf"

Petit nouveau ! | 8 Messages

18 oct. 2016, 12:06

Bonjour à tous,

Voila j'ai crée un page permettant via un formulaire (code ci-dessous)le téléchargement de fichier ".pdf" et ".png".

Code : Tout sélectionner

<?php include("include/bdd.inc.php"); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Ajout de guides pratiques</title> <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> <link href="css/reset.css" rel="stylesheet" type="text/css" /> <link href="css/desgin.css" rel="stylesheet" type="text/css" /> <link href="css/stylesheet.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="contains"> <?php include("include/inc-header.php"); ?> <div id="contener"> <div id="bandeau"> <?php include("include/inc-bandeau.php"); ?> </div> <div id="coprs"> <h2>Ajout Guides Pratiques</h2> <form action="ajout_gp2.php" id="form" method="post" enctype="multipart/form-data" > <table> <tr> <td width="119" class="tit_champ">NOM :</td> <td width="423"><input name="nom" type="text" id="nom" class="txt_champ" /></td> </tr> <tr> <td width="119" class="tit_champ">FICHIER* :</td> <td class="champfichier"><input type="hidden" name="MAX_FILE_SIZE" value="10000000"><input name="fichier_gp" type="file" /></td> </tr> <tr> <td width="119" class="tit_champ">IMAGE** :</td> <td class="champfichier"><input type="hidden" name="MAX_FILE_SIZE2" value="100000"><input name="image_gp" type="file" /></td> </tr> <tr> <td width="119" class="tit_champ">ACTIF</td> <td class="champfichier"><input name="actif" type="checkbox" id="actif" /></td> </tr> <tr> <td>&nbsp;</td> <td><input name="envoyer" type="image" src="design/envoyer.png" value="envoyer" /></td> </tr> </table> </form> <p>* fichier ".pdf"<br /> ** image ".png" : 91x120 pixel </p> </div> <div class="clear"></div> </div> <div id="footer"> <?php include("include/inc-footer.php"); ?> </div> </div> </body> </html>
Le traitement des informations recueillis via le formulaire ce fait sur une seconde page dont voici le code :

Code : Tout sélectionner

<?php include("include/bdd.inc.php"); ?> <?php function filter($in) { $search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@','@[\']@'); $replace = array ('e','a','i','u','o','c','_',''); return preg_replace($search, $replace, $in); } $nom=htmlspecialchars($_POST["nom"]); if(isset($_POST["actif"])){ echo $actif=1 ; } else { echo $actif=0; } if(isset($_FILES['fichier_gp']))echo "<br>" .$fichier_gp;{ $dossier = 'ressources/guides_pratiques/'; echo "<br>" .$dossier; $fichier_gp = basename($_FILES['fichier_gp']['name']); echo "<pre>";print_r($_FILES['fichier_gp']['tmp_name']);echo "</pre>"; $taille_maxi = 10000000; $taille = filesize($_FILES['fichier_gp']['tmp_name']); $extensions = array('.pdf'); $extension = strrchr($_FILES['fichier_gp']['name'], '.'); //Début des vérifications de sécurité... if(!file_exists($dossier)){ echo "<br> Erreur le dossier $dossier n'existe pas !"; } if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau { $erreur = '<br> Vous devez uploader un fichier de type pdf...'; } if($taille>$taille_maxi) { $erreur = '<br> Le fichier est trop gros...'; } if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload { //On formate le nom du fichier ici... $fichier_gp = strtr($fichier_gp, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); $fichier_gp = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier_gp); if(move_uploaded_file($_FILES['fichier_gp']['tmp_name'], $dossier . $fichier_gp)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné... { echo '<br> Upload PDF a effectué avec succès !'; } else //Sinon (la fonction renvoie FALSE). { echo '<br> Echec de l\'upload PDF!';echo "<br> chemin de destination =>" . $dossier . $fichier_gp; } } else { echo $erreur; } if(isset($_FILES['image_gp']))echo "<br>" .$image_gp;{ $dossier = 'image/guides_pratiques/'; echo "<br>" .$dossier; $image_gp = basename($_FILES['image_gp']['name']); echo "<br>" . $_FILES['image_gp']['tmp_name']; $taille_maxi = 100000; $taille = filesize($_FILES['image_gp']['tmp_name']); $extensions = array('.png'); $extension = strrchr($_FILES['image_gp']['name'], '.'); //Début des vérifications de sécurité... if(!file_exists($dossier)){ echo "<br> Erreur le dossier $dossier n'existe pas !"; } if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau { $erreur = '<br> Vous devez uploader un fichier de type png...'; } if($taille>$taille_maxi) { $erreur = '<br> Le fichier est trop gros...'; } if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload { //On formate le nom du fichier ici... $image_gp = strtr($image_gp, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); $image_gp = preg_replace('/([^.a-z0-9]+)/i', '-', $image_gp); if(move_uploaded_file($_FILES['image_gp']['tmp_name'], $dossier . $image_gp)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné... { echo '<br> Upload a IMAGE effectué avec succès !'; } else //Sinon (la fonction renvoie FALSE). { echo '<br> Echec de l\'upload IMAGE !';echo "<br> chemin de destination =>" . $dossier . $image_gp; } } else { echo $erreur; } } $req = $bdd->prepare('INSERT INTO guides_pratiques(nom, fichier_gp, image_gp, actif) VALUES (:nom, :fichier_gp, :image_gp, :actif)'); $req->execute(array( 'nom' => $nom, 'fichier_gp' => $fichier_gp, 'image_gp' => $image_gp, 'actif' => $actif )); error_reporting(E_ALL); //header("location:guides_pratiques.php"); } ?>
Mon problème est que upload du fichier ".png" se fait mais pas le celui du ".pdf" le fichier ne s'enregistre pas sur dans le dossier, j'ai vérifier les autorisations d'écritures tout est ok. D'autre part j'ai une autre page pour le upload d'un seul fichier ".pdf" qui ne marche pas non plus.

Pouvez-vous m'aider.

D'avance merci,,,

Laetitia

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2016, 12:51

salut,

tu as des petit soucis d'indentation et d'organisation du code, c'est le souk la dedans ;)
par exemple error_reporting(E_ALL); en fin de fichier ça sert à rien c'est au début qu'il faut le mettre ;)

en indentant correctement le code et en factorisant un peu on obtient ceci
<?php
error_reporting(E_ALL);
include('include/bdd.inc.php');
function filter($in)
{
    $search = array('@[éèêëÊË]@i', '@[àâäÂÄ]@i', '@[îïÎÏ]@i', '@[ûùüÛÜ]@i', '@[ôöÔÖ]@i', '@[ç]@i', '@[ ]@', '@[\']@');
    $replace = array('e', 'a', 'i', 'u', 'o', 'c', '_', '');
    return preg_replace($search, $replace, $in);
}
function fileNameFormat($fileName){
    $fileName = strtr($fileName,
      'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
      'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    return preg_replace('/([^.a-z0-9]+)/i', '-', $fileName);
}
$nom = htmlspecialchars($_POST['nom']);

if (isset($_POST['actif'])) {
    echo $actif=1 ;
} else {
    echo $actif=0;
}

if (isset($_FILES['fichier_gp'])) {
    echo   '<br>' .$fichier_gp;

    $dossier = 'ressources/guides_pratiques/';
    echo   '<br>' .$dossier;
    $fichier_gp = basename($_FILES['fichier_gp']['name']);
    $taille_maxi = 10000000;
    $taille = filesize($_FILES['fichier_gp']['tmp_name']);
    $extension = strrchr($_FILES['fichier_gp']['name'], '.');
    //Début des vérifications de sécurité...
    $erreur = '';
    // as tu pensé à la casse ? (pdf c'est pas la même chose que PDF même si wondows dit le contraire ;) )
    if ($extension != '.pdf') {
        $erreur .= '<br> Vous devez uploader un fichier de type pdf...';
    }
    if ($taille>$taille_maxi) {
        $erreur .= '<br> Le fichier est trop gros...';
    }
    if (empty($erreur)) { //S'il n'y a pas d'erreur, on upload
  //On formate le nom du fichier ici...
        $fichier_gp = fileNameFormat($fichier_gp);
        //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
        if (move_uploaded_file($_FILES['fichier_gp']['tmp_name'], $dossier . $fichier_gp)) {
            echo '<br> Upload PDF a effectué avec succès !';
        } else { //Sinon (la fonction renvoie FALSE).
            echo '<br> Echec de l\'upload PDF!';
            echo '<br> chemin de destination =>' . $dossier . $fichier_gp;
        }
    } else {
        echo $erreur;
    }
}
if (isset($_FILES['image_gp'])) {
    echo   '<br>' .$image_gp;
    $dossier = 'image/guides_pratiques/';
    echo   '<br>' .$dossier;
    $image_gp = basename($_FILES['image_gp']['name']);
    echo  '<br>' . $_FILES['image_gp']['tmp_name'];
    $taille_maxi = 100000;
    $taille = filesize($_FILES['image_gp']['tmp_name']);
    $extension = strrchr($_FILES['image_gp']['name'], '.');
    $erreur = '';
//Si l'extension n'est pas dans le tableau
    if ($extension != '.png') {
        $erreur .= '<br> Vous devez uploader un fichier de type png...';
    }
    if ($taille>$taille_maxi) {
        $erreur .= '<br> Le fichier est trop gros...';
    }
    if (empty($erreur)) { //S'il n'y a pas d'erreur, on upload
  //On formate le nom du fichier ici...
        $image_gp = fileNameFormat($image_gp);
        if (move_uploaded_file($_FILES['image_gp']['tmp_name'], $dossier . $image_gp)) { //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
            echo '<br> Upload a IMAGE effectué avec succès !';
        } else { //Sinon (la fonction renvoie FALSE).
            echo '<br> Echec de l\'upload IMAGE !';
            echo '<br> chemin de destination =>' . $dossier . $image_gp;
        }
    } else {
        echo $erreur;
    }
}

// alors ça du coup y a de grande chance que ça foire si l'un des deux upload à merdé ;)
if (empty($erreur)) {
    $req = $bdd->prepare('INSERT INTO guides_pratiques(nom, fichier_gp, image_gp, actif) VALUES (:nom, :fichier_gp, :image_gp, :actif)');
    $req->execute(array(
       'nom' => $nom,
       'fichier_gp' => $fichier_gp,
       'image_gp' => $image_gp,
       'actif' => $actif
       ));
}
// header('location:guides_pratiques.php');
j'ai viré les tests sur l’existence des répertoire de destination, c'est a toi de les créer, l'utilisateur se fout de savoir comment c'est stocké ;)

Perso je pencherais plutôt pour un code comme celui, plus de factorisation, moins d'erreur et plus simple à lire et maintenir
<?php
error_reporting(E_ALL);
include('include/bdd.inc.php');
function filter($in)
{
    $search = array('@[éèêëÊË]@i', '@[àâäÂÄ]@i', '@[îïÎÏ]@i', '@[ûùüÛÜ]@i', '@[ôöÔÖ]@i', '@[ç]@i', '@[ ]@', '@[\']@');
    $replace = array('e', 'a', 'i', 'u', 'o', 'c', '_', '');
    return preg_replace($search, $replace, $in);
}
/**
 * Format correctement le nom du fichier pour écriture sur le file système
 * TODO : prendre en compte les espaces et les supprimer
**/
function fileNameFormat($fileName)
{
    $fileName = strtr($fileName,
      'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
      'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    return preg_replace('/([^.a-z0-9]+)/i', '-', $fileName);
}

/**
 * Traitement de l'upload du fichier générique afin de le réemployer au besoin.
 * TODO : le paramètre $allowedExtension peux être modifié en tabeleau s'il y a besoin d'avoir plusieurs extension possible
 * FIXME : prendre en compte le type mime fournit par le fichier (ou mieux le détecter si possible) parce que n'importe qui sais modifier une extension de fichier.
**/
function upload($files, $dossier, $allowedExtension)
{
    $dirLen = strlen($dossier)-1;
    if ((strrpos($dossier, '/') != $dirLen) || strrpos($dossier, '\\') != $dirLen) {
        $dossier .= '/';
    }
    $fileName = basename($files['name']);
    $taille_maxi = 10000000;
    $taille = filesize($files['tmp_name']);
    $extension = strrchr($files['name'], '.');
    //Début des vérifications de sécurité...
    $erreur = '';
    // as tu pensé à la casse ? (pdf c'est pas la même chose que PDF même si wondows dit le contraire ;) )
    if ($extension != $allowedExtension) {
        $erreur .= '<br> Vous devez uploader un fichier de type '.$allowedExtension.'...';
    }
    if ($taille > $taille_maxi) {
        $erreur .= '<br> Le fichier est trop gros...';
    }
    if (empty($erreur)) { //S'il n'y a pas d'erreur, on upload
        //On formate le nom du fichier ici...
        $fileName = fileNameFormat($fileName);
        //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
        if (move_uploaded_file($files['tmp_name'], $dossier . $fileName)) {
            echo '<br> Upload PDF a effectué avec succès !';
        } else { //Sinon (la fonction renvoie FALSE).
            $erreur .= '<br> Echec de l\'upload PDF!';
            $erreur .= '<br> chemin de destination =>' . $dossier . $fileName;
        }
    }
    $r = ['result' => true,'finalName' => $fileName];
    if (!empty($erreur)) {
        $r['error'] = $erreur;
        $r['result'] = false;
    }
    return $r;
}

$dataInsert = [];
if (isset($_FILES['fichier_gp'])) {
    $r = upload($_FILES['fichier_gp'], 'ressources/guides_pratiques/', '.pdf');
    if ($r['result'] === true) {
        echo '<br> Upload PDF a effectué avec succès !';
        $dataInsert['fichier_gp'] = $r['finalName'];
    } else {
        echo $r['error'];
    }
}
if (isset($_FILES['image_gp'])) {
    $r = upload($_FILES['image_gp'], 'ressources/guides_pratiques/', '.png');
    if ($r['result'] === true) {
        echo '<br> Upload de l\'image a effectué avec succès !';
        $dataInsert['image_gp'] = $r['finalName'];
    } else {
        echo $r['error'];
    }
}

if (!empty($dataInsert['image_gp']) && !empty($dataInsert['fichier_gp'])) {
    $req = $bdd->prepare('INSERT INTO guides_pratiques(nom, fichier_gp, image_gp, actif) VALUES (:nom, :fichier_gp, :image_gp, :actif)');
    $nom = htmlspecialchars($_POST['nom']);
    $req->bindValue(':nom', $nom);
    $req->bindValue(':fichier_gp', $dataInsert['fichier_gp']);
    $req->bindValue(':image_gp', $dataInsert['image_gp']);
    $actif = !empty($_POST['actif'])?1:0;
    $req->bindValue(':actif', $actif);
    if (!$req->execute()) {
        // FIXME : récupérer le message d'erreur $req->errorInfo() et l'afficher correctement
        // penser que PDO, par défaut lève aussi une exception en cas d'erreur du coup il faut la "catcher"
        echo 'erreur execution SQL. ';
    }
}
quand au reste, il faut déboguer ton code, soit avec un IDE et mode "debug" soit en ajoutant des var_dump un peu partout.
dans ton cas un var_dump($_POST,$_FILES); au début devrait t'éclairer sur le contenu des variables et ce qui ce passe.

@+
Il en faut peu pour être heureux ......