summaryrefslogtreecommitdiff
path: root/model/Image.php
blob: 1cc0e225ab3ce517eaf1004b07e23559e15d5dd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
// model/Image.php

class Image
{
	private $page;

	private $ajax; // vaut true avec le ckeditor
	public $reponseAjax;

	public $path;
	public $pathMini;
	public $pathInfos;
	public $erreur;

	public function __construct($ajax)
	{
		// get envoyé avec le javascript
		$this->ajax = $ajax;
		$this->page = $_GET['page'];
		$this->path = 'data/' . $this->page . '/images/';
		$this->pathMini = 'data/' . $this->page . '/images-mini/';
	}

	// GET
	
	// SET

	public function upload()
    {
		// traitement et enregistrement de l'image
		if (isset($_FILES['upload']) AND $_FILES['upload']['error'] == 0) // 0 signifie ok
		{
	        $this->pathInfos = pathinfo($_FILES['upload']['name']);
	        $extension = $this->pathInfos['extension'];
	        $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff');
	        // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur)
	        if (in_array($extension, $extautorisées))
	        {
	            move_uploaded_file($_FILES['upload']['tmp_name'], $this->path . $_FILES['upload']['name']);
	            chmod($this->path . $_FILES['upload']['name'], 0666);
	        }
	        else
	        {
	        	$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';
	        }
		}
		else
		{
		    $this->erreur = 'Erreur: Le fichier n\'a pas pu être téléchargé correctement.<br/>
				Au fait, "upload_max_filesize" dans le php.ini vaut ' . ini_get('upload_max_filesize') . '.';
		}

		// retour des rêquetes AJAX
		if($this->ajax && empty($Image->erreur))
		{
			// chemin en JSON attendu par l'éditeur
			$this->reponseAjax = '{"url": "data/' . $this->page . '/images/' . $_FILES['upload']['name'] . '"}';
		}
    }

    // miniatures des photos
    public function makeThumbnail($largeur)
    {
    	global $imageLibrary;

    	if($imageLibrary == 'imagick')
    	{
    		$Image = new Imagick($this->path . $_FILES['upload']['name']);

    		$source = $Image->getImageGeometry();
    		if($source['width'] > $largeur)
    		{
    			// 0 signifie qu'on conserve les proportions
    			$Image->thumbnailImage($largeur, 0);
    		}
    		
    		// écriture dans un fichier
    		$Image->writeImage($this->pathMini . $this->pathInfos['filename'] . '-mini.' . $this->pathInfos['extension']);
    	}
    	elseif($imageLibrary == 'gd')
    	{
	    	// cette fonction fonctionne pour tous les formats
	    	$source = imagecreatefromstring(file_get_contents($this->path . $_FILES['upload']['name']));
	    	$nomMiniImage = $this->pathMini . $this->pathInfos['filename'] . '-mini.jpg';
			$forme = imagesy($source) / imagesx($source);

	    	if(imagesx($source) > $largeur)
	    	{
	    		// créer un rectangle noir
	    		$destination = imagecreatetruecolor($largeur, $largeur * $forme);

	    		// sélectionne un rectangle dans l'image source
	    		// et le place dans un rectangle dans la nouvelle
	    		imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur, $largeur * $forme, imagesx($source), imagesy($source));

	    		// envoie l'image dans un fichier
	    		imagejpeg($destination, $nomMiniImage);
	    	}
	    	else
	    	{
	    		imagejpeg($source, $nomMiniImage);
	    	}
    	}
    	else
    	{
    		// utiliser la grande image si il est impossible de créer une miniature

    		// message d'erreur
    		$_SESSION['erreur'] = addslashes("Echec de la création d'une miniature. Vérifier le fichier config.php");
    		header('Location: index.php?page=' . $this->page . '&erreur=dependance_bibli_images');
            exit();
    	}
    }
}