Réduire la taille/poids d'une image avant upload

Fermé
miltonis Messages postés 238 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 30 septembre 2022 - Modifié le 25 juil. 2020 à 12:52
miltonis Messages postés 238 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 30 septembre 2022 - 26 juil. 2020 à 15:52
hello, hello,

Je sais qu'il y a énormément de solutions différentes sur le web mais rien ne correspond vraiment à ce que je veux faire. D'où la création de ce post ^^

J'ai un script qui me permet d'uploader des images sur le serveur, il fonctionne plutôt bien.
Ce que je souhaite, c'est deux choses :

1. Réduire le poids de l'image avant de l'uploader sur le serveur (via PHP)
2. Afficher une miniature de l'image, une fois celle-ci "chargée" via le champ Input File du formulaire (avant l'envoi donc)


Pouvez-vous m'aider dans l'optimisation de mon code pour répondre à mon double besoin ?

Voici le code du formulaire et du code PHP
Pour le moment je mets tout dans un seul fichier pour les tests ^^
<?php
    error_reporting( E_ALL );
    
    class PostException extends Exception {
        public function __construct( $msg=null, $code=null ){
            parent::__construct( $msg, $code );
        }
        public function geterror(){
            return $this->getMessage();
        }
    }
    
    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        try{
            #look at the form - see how it is using this for image name
            $field='productimage';

            if( isset(
                $_FILES[ $field ],
                $_POST['productname'],
                $_POST['productbrand'],
                $_POST['addername'],
                $_POST['adder_email']
            ) ){
                
                $errors=array();
                $uploads=array();
                $files=array();
                $lineid=false;
                $dbstatus=false;
                
                # edit this as appropriate...
                $dir=__DIR__ . '/imagesStock';

                # the names of the various fields in the form - not images
                $args=array(
                    'productname',
                    'productbrand',
                    'addername',
                    'adder_email'
                );
                foreach( $args as $fieldname ){
                    try{
                        if( !isset( $_POST[ $fieldname ] ) or empty( $_POST[ $fieldname ] ) )throw new PostException( sprintf( 'Missing data: The field "%s" is required.', $fieldname ) );
                        else{
                            ${$fieldname}=$_POST[ $fieldname ];
                        }
                    }catch( PostException $e ){
                        $errors[]=$e->geterror();
                        continue;
                    }
                }
                
                if( empty( $errors ) ){
                    $args=array(...);
                    mysqli_report( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
                    $db=new mysqli( ...array_values( $args ) );
                    $db->set_charset('utf8');
                    $db->begin_transaction();
                    
                    $sql='insert into `cbnadd_newproduct` 
                            ( `productname`, `productbrand`, `addername`, `adder_email` )
                        values
                            ( ?,?,?,? )';
                    $stmt=$db->prepare( $sql );
                    
                    /* bind params and execute */
                    $stmt->bind_param('ssss', $productname, $productbrand, $addername, $adder_email );
                    $dbstatus=$stmt->execute();
                    
                    /* get the ID of the last inserted record */
                    $lineid=$db->insert_id;
                    $stmt->close();
                            

                    # insert records for new images to other table.
                    $sql='insert into `cbnadd_productimages` (`lineid`,`image`) values (?,?)';
                    $stmt=$db->prepare( $sql );
                    $stmt->bind_param('is', $lineid, $targetname );                    
                    
                    $obj=$_FILES[ $field ];
                    foreach( $obj['name'] as $index => $void ){
                        
                        $name=$obj['name'][ $index ];
                        $tmp=$obj['tmp_name'][ $index ];

                        # ensure we don't process non-existant files
                        if( !empty( $tmp ) ){                        
                            $targetname=sprintf('%d_%s_%s_%s_%s', $lineid, $productbrand, $productname, $index, $name );
                            $targetpath=sprintf('%s/%s', $dir, $targetname );
                            $status=move_uploaded_file( $tmp, $targetpath );
                            
                            $uploads[]=$status ? sprintf('The file "%s" has been uploaded OK. Information has been added to the directory: %s', $targetname, ( $dbstatus ? 'True' : 'False' ) ) : sprintf('There was a problem saving "%s". Information logged to db: %s ',$targetname, ( $dbstatus ? 'True' : 'False' ) );
                            
                            # maintain a list of files to be used if db operation fails.
                            $files[]=$targetpath;
                            
                            # save image details... or try to
                            $stmt->execute();
                        }
                    }
                    
                    #commit to database or erase files if there is a problem
                    if( !$db->commit() ) {
                        $errors[]='Failed to commit transaction';
                        foreach( $files as $file ){
                            unlink( $file );
                            $errors[]=sprintf('File deleted: "%s"',$file);
                        }
                        $uploads=[];
                    }

                }
            }
        }catch( Exception $e ){
            $errors[]=$e->getMessage();
        }
    }
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
...
    </head>
    <body>
        <form name='uploads' method='post' enctype='multipart/form-data'>
            
            <fieldset>Champs : Product, Name, Brand</fieldset>
            
            <fieldset>
                <legend>Images à uploader</legend>
                <label>Image-Face:<input type='file' name='productimage[FaceProduct]' /></label>
                <label>Image-Nutrition:<input type='file' name='productimage[NutritionValue]' /></label>
                <label>Image-Ingredients:<input type='file' name='productimage[Ingredients]' /></label>
                <label>Image-Labels:<input type='file' name='productimage[Labels]' /></label>
            </fieldset>
            
            <fieldset>CHamps : USer, Email</fieldset>
            
            <fieldset>
                <input type='submit' />
            </fieldset>
            
            <div>
            <?php
                if( $_SERVER['REQUEST_METHOD']=='POST' ){
                    if( !empty( $uploads ) ){
                        foreach( $uploads as $message )printf('<div class="success">%s</div>',$message);
                    }
                    if( !empty( $errors ) ){
                        foreach( $errors as $message )printf('<div class="error">%s</div>',$message);
                    }
                }
            ?>
            </div>
        </form>
    </body>
</html>


Je sais, le code est long, j'espère que cela ne vous effraie pas... ^^
Un coup de main svp ?
A voir également:

1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
25 juil. 2020 à 14:07
Bonjour,

Le code que tu nous montres.. c'est du PHP .. pas du Javascript.

Quoi qu'il en soit, oui, il va te falloir du javascript.
Il faut que tu fasses l'upload en Ajax.
Par contre, le redimensionnement le plus souvent se traite côté serveur...( donc une fois que le fichier sera uploadé sur le serveur) à l'aide d'un script genre
https://www.frederic-gerard.com/scripts/script-php-pour-redimentionner-une-image-en-conservant-les-proportions.html

Sinon, pour redimensionner une image côté client, tu peux essayer de t'orienter vers les canvas
http://tech.novapost.fr/redimensionner-une-image-cote-client-avant-lupload.html


0
miltonis Messages postés 238 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 30 septembre 2022 19
26 juil. 2020 à 15:52
Bonjour Jordane,
Merci de ton retour. Je suis intéressé par faire le redimensionnement coté client et j'avais en effet trouvé cette info sur un autre forum mais je ne vois pas comment l'utiliser.

Si je comprends bien, le premier bout du code est du Javascript, à partir d'où dois-je l'appeler ? En créant une fonction ?
Je ne suis pas un 'vrai' développeur, je te remercie de ton indulgence ^^
0