[RESOLU] Upload fichier image ne fonctionne pas toujours...

Petit nouveau ! | 6 Messages

16 mars 2019, 11:34

Bonjour,

Je travaille sur un projet perso de galerie photos alimentée par des utilisateurs, après connexion à leur compte, ceux-ci peuvent uploader des photos (que j'afficherais ensuite dans la galerie), je précise que je suis grande débutante, c'est mon 1er projet :D

J'ai un souci avec l'upload qui fonctionne de manière aléatoire (au niveau de la création de imagecreatefromjpeg), je ne comprends pas l'erreur ni pourquoi car cela fonctionne dans un premier temps, puis j'ai une erreur (cela peut-être au bout de 3 images uploadées ou 5 par exemple)

Si quelqu'un veut bien m'aider, ce serait gentil car j'ai beau chercher, je ne comprends pas... Merci par avance pour votre aide !

Voici mon message d'erreur : https://ibb.co/R3xppBw

Et mon code :
// => Upload des photos de l'utilisateur

    // 1 - Vérifie si fichier envoyé
    if(isset($_FILES['userfile']))
    {
    
        $folder = 'upload/';
        $file = basename($_FILES['userfile']['name']);
        $max_size = 5000000; // à adapter avant mise en ligne
        $extensions_list = ['jpg', 'jpeg', 'png'];
        $type_mime_list = ['image/jpg', 'image/jpeg', 'image/png'];
        
        // 2 - Vérifie l'extension du fichier
        $file_extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
        
        if(in_array($file_extension, $extensions_list)) {

            // 3 - Vérifie le type MIME du fichier
            $file = $_FILES['userfile']['tmp_name'];
            $file_mime_type = mime_content_type($file);

            if(in_array($file_mime_type, $type_mime_list)) {
    
            // 4 - Vérifie la taille du fichier
            if($_FILES['userfile']['size'] > $max_size) {
                $alert = "Le fichier est trop gros";

            } else {

                move_uploaded_file($_FILES['userfile']['tmp_name'], 'upload/'.$_FILES['userfile']['name']);

            }

            } else {
                $alert = "Le type de fichier n'est pas autorisé";
            }
            
        } else {
            $alert = "Extension non autorisée";
        }
        $alert = "Votre fichier a bien été envoyé";

        }

        // Redimensionnement du fichier : 1200 x 800 max

        // création copie d'image à redimensionner
        $selected_image = imagecreatefromjpeg($_FILES['userfile']['tmp_name']);
        // définition largeur max
        $file_width_max = 1200;
        // récupération dimension d'image de départ
        $selected_image_size = getimagesize($_FILES['userfile']['tmp_name']);
        // calcul du pourcentage de réduction
        $reduction = (($file_width_max * 100) / $selected_image_size[0]);
        // calcul de la hauteur en appliquant le pourcentage
        $new_height = (($selected_image_size[1] * $reduction) / 100);
        // Création de la nouvelle image
        $new_image = imagecreatetruecolor($file_width_max, $new_height) or die ("erreur");
        // rééchantillonnage de la nouvelle image
        imagecopyresampled($new_image, $selected_image, 0, 0, 0, 0, $file_width_max, $new_height, $selected_image_size[0], $selected_image_size[1]);
        // destruction de la copie d'image
        imagedestroy($selected_image);

        // Enregistrement de la nouvelle image
        $selected_image_name = explode('.', $file);
        // modifie nom retrouvé
        $exploit_image_name = time();
        // enregistre la nouvelle image dans le répertoire
        imagejpeg($new_image, 'upload/'.$exploit_image_name.'.'.$file_extension, 100);

    }


Mammouth du PHP | 1450 Messages

18 mars 2019, 09:11

Vu que tu transfert ton fichier avant de créer ton redimensionnement, je commencerais par créer le redimensionnement à partir du fichier transfèrer et non pas de son emplacement temporaire qui peut être vidé entre temps.

$selected_image = imagecreatefromjpeg($_FILES['userfile']['tmp_name']); => $selected_image = imagecreatefromjpeg('upload/'.$_FILES['userfile']['name']);

aussi comme tu permet des png, il faudrait que dans ce cas tu utilise imagecreatefrompng j'imagine.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Petit nouveau ! | 6 Messages

19 mars 2019, 22:11

Bonsoir Spols,

Merci beaucoup pour ton aide, ça fonctionne !

Par contre, ma fonction imagedestroy() ne fonctionne plus : je ne parviens plus à supprimer l'image de départ qui est pourtant bien $selected_image

Mammouth du PHP | 1450 Messages

20 mars 2019, 10:32

ce n'est pas très grave, php s'en chargera à la fin de son éxecution.

vu la taille de ton script tu n'a pas vraiment à t'inquièté de libérer de la mémoire.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Petit nouveau ! | 6 Messages

20 mars 2019, 10:40

Que veux-tu dire par “php s’en chargera” ?
Après ça, je dois créer des miniatures de chaque image, je vais utiliser le même script je pense, du coup, je vais avoir pas mal de doublons de fichiers qui vont remplir mon serveur !

Mammouth du PHP | 1450 Messages

20 mars 2019, 17:10

à la fin de chaque éxécution de script, php fait le ménage et supprimera donc l'image qu'il a encore en mémoire.
imagedestroy ne sert pas à supprimer un fichier de ton serveur donc si il y a problème de doublons ce n'est pas à cause de cette fonction
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Petit nouveau ! | 6 Messages

20 mars 2019, 21:11

Ok, en fait, je ne comprenais pas car avant l'erreur que j'avais au départ, le fichier original était automatiquement supprimé, c'est pourquoi je pensais que imagedestroy() réalisait cette opération
Du coup, j'ai un nouveau problème à régler :(

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7984 Messages

20 mars 2019, 23:43

Avec unlink() probablement ;)
http://php.net/unlink
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 6 Messages

20 mars 2019, 23:48

Merci @rthur, j’ai déjà essayé...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7984 Messages

20 mars 2019, 23:52

Bah si tu passes en paramètre le bon nom de fichier (avec son chemin), ça va marcher
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 6 Messages

23 mars 2019, 18:02

J'ai repris mon code et plusieurs tutos et cela fonctionne, merci à vous deux pour le temps que vous m'avez consacré !