* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class CelWidgetUploadImageTemp extends Cel { public function createElement($donnees) { $image = $_FILES['fichier']; // chaudrépare $retour = $this->enregistrerImageTemporaire($image); $this->formaterRetourAvecSquelette($retour); } private function formaterRetourAvecSquelette($retour) { $codeRetour = true; if (is_array($retour)) { $squelette = 'services/squelettes/image_temp.tpl.xml'; $contenu = $this->traiterSquelettePhp($squelette, $retour); $mime = 'text/xml'; } else { $contenu = 'Un problème est survenu : '.print_r($retour['message'], true); $codeRetour = false; } if ($codeRetour) { $this->envoyer($contenu, $mime); exit; // pour éviter que JRest renvoie des headers après le contenu - supporté par agathis (nginx) mais pas apache (sequoia) } else { return false; } } // enregistre l'image envoyée dans le chemin de stockage temporaire, puis // renvoie le XML attendu par le widget de saisie du CEL public function enregistrerImageTemporaire($image) { $retour = array( 'urlMiniature' => '', 'imageNom' => '', 'message' => '', 'debogage' => ''); $message = ''; $debogage = ''; if ($image['error'] == UPLOAD_ERR_OK) { if (is_uploaded_file($image['tmp_name'])) { if ($this->verifierFormatJpeg($image['tmp_name'])) { $dossierStockage = $this->config['cel']['chemin_stockage_temp']; $nomFichierOriginal = preg_replace('/[.](jpeg|jpg)$/i', '.jpg', strtolower($image['name'])); $originalChemin = $dossierStockage.'/'.$nomFichierOriginal; $deplacementOk = move_uploaded_file($image['tmp_name'], $originalChemin); if ($deplacementOk === true) { $miniatureFichier = str_replace('.jpg', '_min.jpg', $nomFichierOriginal); $miniatureChemin = $dossierStockage.'/'.$miniatureFichier; // Parametres $largeurIdeale = 100; $hauteurIdeale = 100; $qualite = 85; // Calcul de la hauteur et de la largeur optimale de la miniature $taillesImgOriginale = getimagesize($originalChemin); $largeurOrigine = $taillesImgOriginale[0]; $hauteurOrigine = $taillesImgOriginale[1]; $largeurMin = $largeurIdeale; $hauteurMin = (int) ($hauteurOrigine * ($largeurIdeale / $largeurOrigine)); if ($hauteurMin > $hauteurIdeale) { $hauteurMin = $hauteurIdeale; $largeurMin = (int)($largeurOrigine * ($hauteurMin / $hauteurOrigine)); } // Création de la miniature $imageOriginale = imagecreatefromjpeg($originalChemin); $imageMiniature = imagecreatetruecolor($largeurMin, $hauteurMin); $couleurFond = imagecolorallocate($imageMiniature, 255, 255, 255); imagefill($imageMiniature, 0, 0, $couleurFond); imagecopyresized($imageMiniature, $imageOriginale, 0, 0, 0, 0, $largeurMin, $hauteurMin, $largeurOrigine, $hauteurOrigine); imagejpeg($imageMiniature, $miniatureChemin, $qualite); imagedestroy($imageMiniature); imagedestroy($imageOriginale); // Retour des infos $retour['urlMiniature'] = sprintf($this->config['cel']['images_temp_url'], $miniatureFichier); $retour['imageNom'] = $nomFichierOriginal; } else { $message = "L'image n'a pu être déplacé sur le serveur."; } } else { $message = "L'image n'est pas au format JPEG."; } } else { $message = "L'image n'a pu être téléversée."; $debogage = $message.print_r($image, true); } } else { if ($image['error'] == UPLOAD_ERR_FORM_SIZE) { $message = "L'image téléversée excède la taille maximum autorisée.". "Veuillez modifier votre image avant de la téléverser à nouveau."; } else { $message = "Une erreur de transfert a eu lieu (téléversement interrompu)."; } $debogage = "Code erreur : {$image['error']}. ". "Voir : http://php.net/manual/fr/features.file-upload.errors.php"; } // Retour des infos $retour['message'] = $message; $retour['debogage'] = $debogage; return $retour; } // Il ne faut pas utiliser l'index type du tableau files pour tester // si une image est en jpeg car le type renvoyé par les navigateurs // peut varier (ex. sous ie qui renvoie image/pjpeg private function verifierFormatJpeg($chemin) { // get imagesize renvoie un résultat consistant par contre $infos = getimagesize($chemin, $infos); return (isset($infos['mime']) && $infos['mime'] == 'image/jpeg'); } } ?>