Déplacement de fichier

Ce topic a été résolu
salutlacompagnie

salutlacompagnie Le 3 juillet 2016 à 20:29 (Édité le 25 janvier 2019 à 17:51)

Bonjour à tous,

Je rencontre actuellement un soucis de déplacement de fichier avec la fonction
move_uploaded_file()
La création du fichier et la verification du contenu fonctionne très bien mais le déplacement du fichier vers la destination plante, j'ai beau chercher, tourner dans touts les sens je ne trouve pas le probleme..

<?php
} else {
// Création du fichier
$fichier = fopen($_POST['filename'],"w");

// Vérification de contenu
if (fwrite($fichier,$_POST['contenu']))    {
echo "Le fichier à été créé avec succès";
} else {
// Erreur
echo "Impossible de créer le fichier";
}

//déplacement du fichier vers la destination
$destination = 'C:/www/monsite/protect/enregistrement';
if (move_uploaded_file($fichier['filename']['contenu'], $destination)) {
echo "Le fichier à bien été déplacé";
}else{
    echo "Le fichier n'a pas été déplacé";
}

fclose($fichier);
}
?> 
ps: Aller les bleus!!!
TheOldNoob

TheOldNoob Le 4 juillet 2016 à 22:55

Salut salut !
Tu n'a pas besoin de mettre c:/www....

Tu part du principe que tu est dans un dossier qui traite ton formulaire sur ton fichier index.php a la racine de ton site.
Tu souhaite mettre ton image disons dans un dossier qui s'appel img

Tu devra donc définir :
$destination = '/img'
Ton fichier sera donc télécharger et déposer dans ton dossier img

Si par exemple, tu te trouve sur un page qui est déjà dans un dossier. Comme par exemple, un dossier nomé assets. Tu devra donc dans un premier temps sortir de ton dossier avec ../

$destination = '../img'
La tu lui a dis, de sortir du dossier assets, puis de rentré dans le dossier img.

Par contre, bien que ton code peu être fonctionnel, je te déconseil de le mettre sur ton site.
Tu ne fait pas assez de condition, qui vont te permetre de limité et donc protéger ton site.
Par exemple, tu ne limite pas de type mime. Donc n'importe quel type de fichier peu être uploader sur ton serveur.
Ensuite, tu ne limite pas la taille de ton fichier. Si tu a un serveur qui a un espace de 100mo, et qu'un type pour a envie d'uploadé un fichier .mkv de 5GO. Autant dire que ton hébergeur va tiré la gueule 😋

Je te met, un bout de code assez complet, avec les conditions qui vont bien 😀
Je me suis servie de se code pour uploadé l'image de musiciens sur le site d'un groupe de musique.
// Pour commencer, j'instancie les variables dont je vais avoir besoin
$dirlink = "link-default.jpg";
$folder = '../images/'; // 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, permet une lecture plus facile de la taille maximum souhaité

if(!empty($_FILES) && isset($_FILES['picture'])) { // Si $_FILES n'est pas vide et qu'il est remplie

    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)
        
        $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'); // autorise les fichier du type .jpeg .jpg .png et .gif
                              // A savoir que le image/ n'est en aucun cas le dossier de destination, mais le type mime
        if (in_array($mimeType, $mimTypeOK)) { // in_array() permet de tester si la valeur de $mimeType est contenue dans le tableau $mimTypeOK
                    

            $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 link au format : zicos-id-timestamp.jpg
            $finalFileName = 'musicien-'.time().'.'.$fileExtension; // Le nom du fichier sera donc zicos-id-timestamp.jpg (time() retourne un timestamp à 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 sûr que mon image est au bon endroit
                    $dirlink = $finalFileName;
                    
                }
                else {
                    // Permet d'assigner un link par défaut
                    $dirlink = "link-default.jpg";
                }
        } // if (in_array($mimeType, $mimTypeOK))

        else {
            $error[] = 'Ce 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 choisir 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 link par défaut si la musicien n'en a aucun
    $dirlink = "link-default.jpg";
}
salutlacompagnie

salutlacompagnie Le 6 juillet 2016 à 18:58

Salut,

En faite la je récupère toutes les infos entrée par l'utilisateur dans différents formulaires (environs 10) ils peuvent comprendre des textes important ainsi que des images , et enfaite je met tout le contenu dans un dossier et une page qui leur est destiné..
Donc logiquement j'ai pas forcement besoin de le vérifier car je sais qu'il est déjà sécurisé au par avant grâce au formulaire..

Me conseilles-tu de sécuriser encore une fois celui-ci ou de le laisser comme ça?

Merci pour tes réponses depuis le début de mon inscription =)
TheOldNoob

TheOldNoob Le 6 juillet 2016 à 19:09 (Édité le 6 juillet 2016 à 19:11)

Il faut absolument sécurisé chacun des champs, un par un. Il n'y a jamais assez de protection. Si tu sécurise les 10 autres, il faut sécurisé celui ci également.
Avec le code que j'ai donné, tu limite surtout la taille et le type des fichiers afin que ne soit pas uploader sur ton serveur, n'importe quel type et n'importe quel taille de fichier. Même, si normalement, les serveur que tu loue limite déjà la taille dans le php.ini
salutlacompagnie

salutlacompagnie Le 7 juillet 2016 à 16:50

D'accord merci =)
TheOldNoob

TheOldNoob Le 7 juillet 2016 à 19:17

je t'en pris 😀
content de t'avoir aidé 😉
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte