Modification de script Upload avec redimensionnement image

Eléphanteau du PHP | 15 Messages

25 oct. 2013, 15:48

Bonjour à toutes et çà tous,

je viens vers vous car je suis un peu bloqué sur un script que je dois réaliser pour l'upload de photo avec redimensionnement.
Actuellement, le script rempli bien sa fonction sauf qu'il me rogne les images et ne prends pas en compte le sens de la photo de base... Je cherche donc à savoir comment ajouter la fonction qui va vérifier si la photo est en horizontal ou vertical et éviter de me rogner l'image.

Voici le code actuel :
<?php
function resize($width, $height){
	/* Détection des dimensions x y de l'image*/
	list($w, $h) = getimagesize($_FILES['image']['tmp_name']);
	/* Calcul de la taille de la nouvelle image avec ratio */
	$ratio = max($width/$w, $height/$h);
	$h = ceil($height / $ratio);
	$x = ($w - $width / $ratio) / 2;
	$w = ceil($width / $ratio);
	/* Nouveau nom de fichier */
	$path = '../albums/'.$_FILES['image']['name'];
	/* Lecture des données binaires de l'image */
	$imgString = file_get_contents($_FILES['image']['tmp_name']);
	/* creation de l'image */
	$image = imagecreatefromstring($imgString);
	$tmp = imagecreatetruecolor($width, $height);
	imagecopyresampled($tmp, $image,
  	0, 0,
  	$x, 0,
  	$width, $height,
  	$w, $h);
	/* Sauvegarde de l'image */
	switch ($_FILES['image']['type']) {
		case 'image/jpeg':
			imagejpeg($tmp, $path, 100);
			break;
		case 'image/png':
			imagepng($tmp, $path, 0);
			break;
		case 'image/gif':
			imagegif($tmp, $path);
			break;
		default:
			exit;
			break;
	}
	return $path;
	/* Nettoyage du cache */
	imagedestroy($image);
	imagedestroy($tmp);
}
?>
Pouvez vous m'aider à finaliser ça s'il vous plaît? J'ai testé pas mal de variable sans grands résultats mais certainement due à mon peu de connaissance en PHP.

Merci beaucoup par avance!
Modifié en dernier par moogli le 26 oct. 2013, 10:21, modifié 1 fois.
Raison : Bbcode php

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

26 oct. 2013, 10:24

Salut,

Tu as tout ce qui faut dans code pour cela, juste un peu de logique.
Elle est expliquée dans ce tuto http://www.lephpfacile.com/cours/22-la-librairie-gd ;)


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

Eléphanteau du PHP | 15 Messages

27 oct. 2013, 18:18

Bonjour,

merci. J'ai bien progressé avec de l'appui et aujourd'hui, l'upload avec redimensionnement + miniatures fonctionne parfaitement.
Je déposerais le code ici une fois complet car je m'attaque à la partie Multiupload suivi d'une possibilité de suppressions de fichiers.
Avez vous une piste pour la mise en place du multi upload? J'ai essayé avec l'argument Multiple qui permet le multiselect mais j'ai un problème au traitement de l'envoi.

Merci par avance.

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

27 oct. 2013, 18:59

pour l'upload multiple j'ai un exemple la

sinon tu as, dans les contributions, un script de AB qui fait tous ce que tu demande (voir même plus ;) ).


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

Eléphanteau du PHP | 15 Messages

27 oct. 2013, 19:50

Ok merci pour l'exemple.
En gros en vrac, le fichier ressemble à ça actuellement (attention, le nettoyage et mise en forme du code n'est pas fait ;p) :

<?php
include( 'function.php');
// Paramètres
$max_file_size = 1024*2000; // 2000kb
$valid_exts = array('jpeg', 'jpg', 'png', 'gif');
// Taille des images redimentionnées
$sizes = array(720 => 540);
$sizes_thumb = array(200 => 150);

if ($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($_FILES['image'])) {
	if( $_FILES['image']['size'] < $max_file_size ){
		// Contrôle de l'extention
		$ext = strtolower(pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION));
		if (in_array($ext, $valid_exts)) {
			// Définition du nom de l'image
			$dossier_img = '/albums/';
			$num_new_img = getNumNewImage($dossier_img, $valid_exts);
			$nom_img = $num_new_img.'.'.$ext;
			/* Redimensionnement d'image */
			foreach ($sizes as $w => $h) {
				$files[] = resize($w, $h, $nom_img);
			}
			foreach ($sizes_thumb as $w => $h) {
				$files[] = create_thumb($w, $h, $nom_img);
			}

		} else {
			$msg = 'Fichier non supporté';
		}
	} else{
		$msg = 'Envoi un fichier de moins de 2Mo!';
	}
}
?>
<!doctype html>
<html>
<head>
	<meta charset=iso-8859-1" />
	<title>Upload photos</title>
	<link rel="stylesheet" href="style.css">
</head>
<body>
	<div class="wrap">
		<h1>Upload Photo</h1>
		<?php if(isset($msg)): ?>
			<p class='alert'><?php echo $msg ?></p>
		<?php endif ?>
		
		<!-- Formulaire d'upload -->
		<form action="" method="post" enctype="multipart/form-data">
			<label>
				<span>Choix de l'image</span>
				<input type="file" name="image" accept="image/*" />
			</label>
			<input type="submit" value="Upload" />
		</form>
		
		<?php
		// affichage de l'image redimensionnée.
		if(isset($files)){
			foreach ($files as $image) {
				echo "<img class='img' src='{$image}' /><br /><br />";
			}
		}
		?>
	</div>
</body>
</html>
Si je comprends bien, il faut utiliser la fonction "foreach" pour me permettre de traiter du multiupload en oubliant pas d'ajouter au formulaire nom='image[]' c'est bien ça?

Merci.

Eléphanteau du PHP | 15 Messages

29 oct. 2013, 17:42

Salut à toutes et à tous,

voici l'état actuel du code upload :
<?php
include( 'function.php');
// Paramètres
$max_file_size = 1024*4000; // 4000kb
$valid_exts = array('jpeg', 'jpg', 'png', 'gif');
// Taille des images redimentionnées
$sizes = array(720 => 540);
$sizes_thumb = array(200 => 150);

if ($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($_FILES)) {
	foreach($_FILES as $file){
		if( $file['size'] < $max_file_size ){
			// Contrôle de l'extention
			$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
			if (in_array($ext, $valid_exts)) {
				// Définition du nom de l'image
				$dossier_img = '/tattoo/albums/Gallerie/';
				$num_new_img = getNumNewImage($dossier_img, $valid_exts);
				$nom_img = $num_new_img.'.'.$ext;
				/* Redimensionnement d'image */
				foreach ($sizes as $w => $h) {
					$files[] = resize($w, $h, $nom_img);
				} 
				foreach ($sizes_thumb as $w => $h) {
					$files[] = create_thumb($w, $h, $nom_img);
				}

			} else {
				$msg = 'Fichier non supporté';
			}
		} else{
			$msg = 'Envoi un fichier de moins de 4Mo!';
		}
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
	<meta charset=iso-8859-1" />
	<title>Upload photos</title>
	<link rel="stylesheet" href="style.css">
</head>
<body>
	<div class="wrap">
		<h1>Upload Photo</h1>
		<?php if(isset($msg)): ?>
			<p class='alert'><?php echo $msg ?></p>
		<?php endif ?>
		
		<!-- Formulaire d'upload -->
		<form action="" method="post" enctype="multipart/form-data">
			<label>
				<span>Choix de l'image</span><br />
				<input type="file" name="image1" /><br />
				<input type="file" name="image2" /><br />
				<input type="file" name="image3" /><br />
			</label>
			<input type="submit" value="Upload" />
		</form>
		
		<?php
		// affichage de l'image redimensionnée.
		if(isset($files)){
			foreach ($files as $image) {
				echo "<img class='img' src='{$image}' /><br /><br />";
			}
		}
		?>
	</div>
</body>
</html>
Le soucis est que je me retrouve avec une page blanche à l'upload et pas de sauvegarde sur le FTP quoi.
J'ai testé en changeant
if ($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($_FILES)) {
par
if ($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($_FILES ['image'])) {
puis en changeant le
name='image1'
dans le formulaire par
name='image[]'
mais sans succès...

Avez vous une idée s'il vous plait parce que là je sèche complet.

Merci.

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

29 oct. 2013, 21:14

Salut,

Ton code ne fait rien ;)

Pas de redimensionnement, pas de copie des fichiers donc effectivement ton diagnostique me semble correct :mrgreen:

Il faut que tu mette dans le foreach ($_FILES ...) tu dois mettre le code de copie et redimensionnement de l'image.

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

Eléphanteau du PHP | 15 Messages

31 oct. 2013, 10:21

Bonjour,

effectivement tout ça a bien été revu et corrigé! Tout fonctionne maintenant mais il reste un léger soucis :

Il y a 5 champs Upload, lorsque je charge une image dans le premier tout va bien, a partir du second, dès que je charge une image le script me demande de recharger l'image 1.
En schématisant : Fichier 1 chargé -> Ok; Fichier 2 chargé : Ok mais la fenêtre de sélection se ré ouvre pour charger l'image 1 etc etc..
Je ne sais pas si c'est assez clair.. :/ Je laisse le script ici si jamais vous avez une idée :
<?php
include( 'function.php');
// Paramètres
$max_file_size = 1024*4000; // 4000kb
$valid_exts = array('jpeg', 'jpg', 'png', 'gif');
// Taille des images redimentionnées
$sizes = array(1024 => 768);
$sizes_thumb = array(200 => 150);

$files = array();
if(isset($_FILES['image1']['name']) && $_FILES['image1']['name'] != "")
	$files[] = $_FILES['image1'];
if(isset($_FILES['image2']['name']) && $_FILES['image2']['name'] != "")
	$files[] = $_FILES['image2'];
if(isset($_FILES['image3']['name']) && $_FILES['image3']['name'] != "")
	$files[] = $_FILES['image3'];
if(isset($_FILES['image4']['name']) && $_FILES['image4']['name'] != "")
	$files[] = $_FILES['image4'];
if(isset($_FILES['image5']['name']) && $_FILES['image5']['name'] != "")
	$files[] = $_FILES['image5'];

if ($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($files[0])) {
        foreach($files as $file){
                if( $file['size'] < $max_file_size ){
                        // Contrôle de l'extention
                        $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
                        if (in_array($ext, $valid_exts)) {
                                // Définition du nom de l'image
                                $dossier_img = '/tattoo/albums/Gallerie/';
                                $num_new_img = getNumNewImage($dossier_img, $valid_exts);
                                $nom_img = $num_new_img.'.'.$ext;
                                /* Redimensionnement d'image */
                                foreach ($sizes as $w => $h) {
                                        resize($file, $w, $h, $nom_img);
                                }
                                foreach ($sizes_thumb as $w => $h) {
                                        if(create_thumb($file, $w, $h, $nom_img))
											$images[] = $dossier_img.'thumbs/'.$nom_img;
                                }

                        } else {
                                $msg = 'Fichier non supporté';
                        }
                } else {
                        $msg = 'Envoi un fichier de moins de 4Mo!';
                }
        }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
        <meta charset=iso-8859-1" />
        <title>Upload photos</title>
        <link rel="stylesheet" href="style.css">
</head>
<body>
        <div class="wrap">
                <h1>Upload Photo</h1>
                <?php if(isset($msg)): ?>
                        <p class='alert'><?php echo $msg ?></p>
                <?php endif ?>
               
                <!-- Formulaire d'upload -->
                <form action="" method="post" enctype="multipart/form-data">
                        <label>
                                <span>Choix de l'image</span><br />
                                <input type="file" name="image1" /><br />
                                <input type="file" name="image2" /><br />
                                <input type="file" name="image3" /><br />
								<input type="file" name="image4" /><br />
                                <input type="file" name="image5" /><br />
                        </label>
                        <input type="submit" value="Upload" />
                </form>
               
                <?php
                // affichage de l'image redimensionnée.
                if(isset($images)){
                        foreach ($images as $image) {
                                echo "<img class='img' src='{$image}' /><br /><br />";
                        }
                }
                ?>
        </div>
</body>
</html>
Merci beaucoup :)

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

31 oct. 2013, 10:51

salut,

$files = array();
if(isset($_FILES['image1']['name']) && $_FILES['image1']['name'] != "")
$files[] = $_FILES['image1'];
if(isset($_FILES['image2']['name']) && $_FILES['image2']['name'] != "")
$files[] = $_FILES['image2'];
if(isset($_FILES['image3']['name']) && $_FILES['image3']['name'] != "")
$files[] = $_FILES['image3'];
if(isset($_FILES['image4']['name']) && $_FILES['image4']['name'] != "")
$files[] = $_FILES['image4'];
if(isset($_FILES['image5']['name']) && $_FILES['image5']['name'] != "")
$files[] = $_FILES['image5'];
code inutile

idem pour
foreach ($sizes as $w => $h) {
resize($file, $w, $h, $nom_img);
}
foreach ($sizes_thumb as $w => $h) {
if(create_thumb($file, $w, $h, $nom_img))
$images[] = $dossier_img.'thumbs/'.$nom_img;
}
et les tableaus associés
$sizes = array(1024 => 768);
$sizes_thumb = array(200 => 150);

a moins que tu ai prévu de pouvoir faire plusieurs réductions différentes ?
si oui un seul tableau suffit => par exemple
<?php
$taille = [['x' => 768, 'y' => 1024], ['x' => 150, 'y' => 200]];
quand au reste effectivement ce n'est pas clair.
lorsque tu as choisis tes images tu clique sur le bouton submit et la validation s'effectue.
lorsque tu ré affiche le formulaire aucune fenêtre de sélection de fichier ne peux s'ouvrir.


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

Eléphanteau du PHP | 15 Messages

31 oct. 2013, 11:43

Bonjour,

je ne sais comment expliquer ce phénomène... Je vais essayer d'être plus clair :

Je clique sur le bouton Parcourir pour l'image 1, ça m'ouvre l'explorer pour choisir mon fichier et je valide. Jusque là c'est normal.
Je clique sur le bouton Parcourir pour l'image 2, ça m'ouvre l'explorer pour choisir mon fichier et je valide, mais là il me ré-ouvre l'explorer en me demandant de choisir l'image 1! Je fais annuler et c'est ok mais pourquoi ça me ré-ouvre l'explorer?
Si je clique sur le Parcourir de l'image 3,idem que pour l'image 2, ça ré-ouvre l'explorer en me demandant toujours de recharger l'image 1...

Je ne sais pas si c'est plus clair du coup?

Merci en tout cas à toi!

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

31 oct. 2013, 12:10

c'est un problème navigateur, tu n'aurais un truc genre plugin / addon qui pourrait faire ça ?
je viens de tester sur chrome sans aucun problème.

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

Eléphanteau du PHP | 15 Messages

31 oct. 2013, 12:34

c'est un problème navigateur, tu n'aurais un truc genre plugin / addon qui pourrait faire ça ?
je viens de tester sur chrome sans aucun problème.

@+
Salut,
aucuns plugins ni rien... Je viens de tester et effectivement, ça fonctionne uniquement sous Chrome! IE et Firefox pose le problème.. C'est encore plus incompréhensible là.

Une idée? Je cherche de mon coté mais rien ne me semble incorrect!
Merci.

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

01 nov. 2013, 01:19

aucune solution si le navigateur ne gère pas ce type de formulaire.

j'ai effectivement testé avec les dernières version de firefox et IE et c'est pas top.

as tu essayé l’élément multiple ? cela pourrait résoudre ton problème ?
<input type="file" name="image1" multiple/>
(et supprimer les autres champs)

bon par contre c'est top à utiliser ;)

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

Eléphanteau du PHP | 15 Messages

01 nov. 2013, 19:49

Salut,

alors j'ai supprimé les autres champs et donc laissé celui indiqué dans la réponse mais ça ne fonctionne pas... Si je tente d'uploader un seul fichier, ça à l'air de fonctionner mais si je select plusieurs fichiers, là pas d'upload...

Au passage, j'ai un soucis avec la galerie photo aussi : sous Firefox aucuns soucis avec la visionneuse mais sous IE et Chrome l'effet ne fonctionne pas du tout et l'image s'ouvre simplement :/

(si jamais l'url www.kurtspiritcreation.com rubrique Tattoo).

Merci.

Eléphanteau du PHP | 15 Messages

12 nov. 2013, 08:44

Bonjour,

juste pour vous dire merci pour tout.
Les scripts sont fonctionnels à présent, seul le bug de l'envoi cité ci dessus continu mais le reste est ok.

Bonne journée!