Fixed bug #3777: thumbs.php looks for file in t3lib/gfx instead of typo3/gfx
[Packages/TYPO3.CMS.git] / t3lib / thumbs.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Generates a thumbnail and returns an image stream, either GIF/PNG or JPG
29 *
30 * $Id$
31 * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj
32 *
33 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
34 */
35 /**
36 * [CLASS/FUNCTION INDEX of SCRIPT]
37 *
38 *
39 *
40 * 113: class SC_t3lib_thumbs
41 * 134: function init()
42 * 164: function main()
43 *
44 * SECTION: OTHER FUNCTIONS:
45 * 267: function errorGif($l1,$l2,$l3)
46 * 319: function fontGif($font)
47 * 366: function wrapFileName($inputName)
48 *
49 * TOTAL FUNCTIONS: 5
50 * (This index is automatically created/updated by the extension "extdeveval")
51 *
52 */
53
54
55 // *******************************
56 // Set error reporting
57 // *******************************
58 error_reporting (E_ALL ^ E_NOTICE);
59
60
61
62 // ******************
63 // Constants defined
64 // ******************
65 define('TYPO3_OS', stristr(PHP_OS,'win')&&!stristr(PHP_OS,'darwin')?'WIN':'');
66 define('TYPO3_MODE','BE');
67 if(!defined('PATH_thisScript')) define('PATH_thisScript',str_replace('//','/', str_replace('\\','/', (php_sapi_name()=='cgi'||php_sapi_name()=='isapi' ||php_sapi_name()=='cgi-fcgi')&&($_SERVER['ORIG_PATH_TRANSLATED']?$_SERVER['ORIG_PATH_TRANSLATED']:$_SERVER['PATH_TRANSLATED'])? ($_SERVER['ORIG_PATH_TRANSLATED']?$_SERVER['ORIG_PATH_TRANSLATED']:$_SERVER['PATH_TRANSLATED']):($_SERVER['ORIG_SCRIPT_FILENAME']?$_SERVER['ORIG_SCRIPT_FILENAME']:$_SERVER['SCRIPT_FILENAME']))));
68 if(!defined('PATH_site')) define('PATH_site', ereg_replace('[^/]*.[^/]*$','',PATH_thisScript)); // the path to the website folder (see init.php)
69 if(!defined('PATH_t3lib')) define('PATH_t3lib', PATH_site.'t3lib/');
70 define('PATH_typo3conf', PATH_site.'typo3conf/');
71 define('TYPO3_mainDir', 'typo3/'); // This is the directory of the backend administration for the sites of this TYPO3 installation.
72
73 // ******************
74 // Including config
75 // ******************
76 require_once(PATH_t3lib.'class.t3lib_div.php');
77 require_once(PATH_t3lib.'class.t3lib_extmgm.php');
78
79 require(PATH_t3lib.'config_default.php');
80 if (!defined ('TYPO3_db')) die ('The configuration file was not included.');
81 if (!$TYPO3_CONF_VARS['GFX']['image_processing']) die ('ImageProcessing was disabled!');
82
83 require_once(PATH_t3lib.'class.t3lib_db.php'); // The database library
84 $TYPO3_DB = t3lib_div::makeInstance('t3lib_DB');
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 /**
102 * Class for generating a thumbnail from the input parameters given to the script
103 *
104 * Input GET var, &file: relative or absolute reference to an imagefile. WILL be validated against PATH_site / lockRootPath
105 * Input GET var, &size: integer-values defining size of thumbnail, format '[int]' or '[int]x[int]'
106 *
107 * Relative paths MUST BE the first two characters ONLY: eg: '../dir/file.gif', otherwise it is expect to be absolute
108 *
109 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
110 * @package TYPO3
111 * @subpackage t3lib
112 */
113 class SC_t3lib_thumbs {
114 var $include_once=array();
115
116 var $outdir = 'typo3temp/'; // The output directory of temporary files in PATH_site
117 var $output = '';
118 var $sizeDefault='56x56';
119
120 var $imageList; // Coming from $TYPO3_CONF_VARS['GFX']['imagefile_ext']
121 var $input; // Contains the absolute path to the file for which to make a thumbnail (after init())
122
123 // Internal, static: GPvar:
124 var $file; // Holds the input filename (GET: file)
125 var $size; // Holds the input size (GET: size)
126
127
128 /**
129 * Initialize; reading parameters with GPvar and checking file path
130 * Results in internal var, $this->input, being set to the absolute path of the file for which to make the thumbnail.
131 *
132 * @return void
133 */
134 function init() {
135 global $TYPO3_CONF_VARS;
136
137 // Setting GPvars:
138 $this->file = t3lib_div::_GP('file');
139 $this->size = t3lib_div::_GP('size');
140
141 // Image extension list is set:
142 $this->imageList = $TYPO3_CONF_VARS['GFX']['imagefile_ext']; // valid extensions. OBS: No spaces in the list, all lowercase...
143
144 // if the filereference $this->file is relative, we correct the path
145 if (substr($this->file,0,3)=='../') {
146 $this->input = PATH_site.substr($this->file,3);
147 } else {
148 $this->input = $this->file;
149 }
150
151 // Now the path is absolute.
152 // Checking for backpath and double slashes + the thumbnail can be made from files which are in the PATH_site OR the lockRootPath only!
153 if (!t3lib_div::isAllowedAbsPath($this->input)) {
154 $this->input='';
155 }
156 }
157
158 /**
159 * Create the thumbnail
160 * Will exit before return if all is well.
161 *
162 * @return void
163 */
164 function main() {
165 global $TYPO3_CONF_VARS;
166
167 // If file exists, we make a thumbsnail of the file.
168 if ($this->input && @file_exists($this->input)) {
169
170 // Check file extension:
171 $reg = array();
172 if (ereg('(.*)\.([^\.]*$)',$this->input,$reg)) {
173 $ext=strtolower($reg[2]);
174 $ext=($ext=='jpeg')?'jpg':$ext;
175 if ($ext=='ttf') {
176 $this->fontGif($this->input); // Make font preview... (will not return)
177 } elseif (!t3lib_div::inList($this->imageList, $ext)) {
178 $this->errorGif('Not imagefile!',$ext,basename($this->input));
179 }
180 } else {
181 $this->errorGif('Not imagefile!','No ext!',basename($this->input));
182 }
183
184 // ... so we passed the extension test meaning that we are going to make a thumbnail here:
185 $this->size = $this->size ? $this->size : $this->sizeDefault; // default
186
187 // I added extra check, so that the size input option could not be fooled to pass other values. That means the value is exploded, evaluated to an integer and the imploded to [value]x[value]. Furthermore you can specify: size=340 and it'll be translated to 340x340.
188 $sizeParts = explode('x', $this->size.'x'.$this->size); // explodes the input size (and if no "x" is found this will add size again so it is the same for both dimensions)
189 $sizeParts = array(t3lib_div::intInRange($sizeParts[0],1,1000),t3lib_div::intInRange($sizeParts[1],1,1000)); // Cleaning it up, only two parameters now.
190 $this->size = implode('x',$sizeParts); // Imploding the cleaned size-value back to the internal variable
191 $sizeMax = max($sizeParts); // Getting max value
192
193 // Init
194 $mtime = filemtime($this->input);
195 $outpath = PATH_site.$this->outdir;
196
197 // Should be - ? 'png' : 'gif' - , but doesn't work (ImageMagick prob.?)
198 // René: png work for me
199 $thmMode = t3lib_div::intInRange($TYPO3_CONF_VARS['GFX']['thumbnails_png'],0);
200 $outext = ($ext!='jpg' || ($thmMode & 2)) ? ($thmMode & 1 ? 'png' : 'gif') : 'jpg';
201
202 $outfile = 'tmb_'.substr(md5($this->input.$mtime.$this->size),0,10).'.'.$outext;
203 $this->output = $outpath.$outfile;
204
205 if ($TYPO3_CONF_VARS['GFX']['im']) {
206 // If thumbnail does not exist, we generate it
207 if (!@file_exists($this->output)) {
208 /* if (strstr($this->input,' ') || strstr($this->output,' ')) {
209 $this->errorGif('Spaces in','filepath',basename($this->input));
210 }
211 */ // 16 colors for small (56) thumbs, 64 for bigger and all for jpegs
212 if ($outext=='jpg') {
213 $colors = '';
214 } else {
215 $colors = ($sizeMax>56)?'-colors 64':'-colors 16';
216 }
217 $path = $TYPO3_CONF_VARS['GFX']['im_path_lzw'] ? $TYPO3_CONF_VARS['GFX']['im_path_lzw'] : $TYPO3_CONF_VARS['GFX']['im_path'];
218 $parameters = '-sample '.$this->size.' '.$colors.' '.$this->wrapFileName($this->input.'[0]').' '.$this->wrapFileName($this->output);
219 $cmd = t3lib_div::imageMagickCommand('convert', $parameters);
220 exec($cmd);
221 if (!@file_exists($this->output)) {
222 $this->errorGif('No thumb','generated!',basename($this->input));
223 }
224 }
225 // The thumbnail is read and output to the browser
226 if($fd = @fopen($this->output,'rb')) {
227 Header('Content-type: image/'.$outext);
228 while (!feof($fd)) {
229 echo fread($fd, 10000);
230 }
231 fclose( $fd );
232 } else {
233 $this->errorGif('Read problem!','',$this->output);
234 }
235 } else exit;
236 } else {
237 $this->errorGif('No valid','inputfile!',basename($this->input));
238 }
239 }
240
241
242
243
244
245
246
247
248
249
250
251 /***************************
252 *
253 * OTHER FUNCTIONS:
254 *
255 ***************************/
256
257 /**
258 * Creates error image based on gfx/notfound_thumb.png
259 * Requires GD lib enabled, otherwise it will exit with the three textstrings outputted as text.
260 * Outputs the image stream to browser and exits!
261 *
262 * @param string Text line 1
263 * @param string Text line 2
264 * @param string Text line 3
265 * @return void
266 */
267 function errorGif($l1,$l2,$l3) {
268 global $TYPO3_CONF_VARS;
269
270 if (!$TYPO3_CONF_VARS['GFX']['gdlib']) die($l1.' '.$l2.' '.$l3);
271
272 // Creates the basis for the error image
273 if ($TYPO3_CONF_VARS['GFX']['gdlib_png']) {
274 Header('Content-type: image/png');
275 $im = imagecreatefrompng(TYPO3_mainDir.'gfx/notfound_thumb.png');
276 } else {
277 Header('Content-type: image/gif');
278 $im = imagecreatefromgif(TYPO3_mainDir.'gfx/notfound_thumb.gif');
279 }
280 // Sets background color and print color.
281 $white = ImageColorAllocate($im, 0,0,0);
282 $black = ImageColorAllocate($im, 255,255,0);
283
284 // Prints the text strings with the build-in font functions of GD
285 $x=0;
286 $font=0;
287 if ($l1) {
288 imagefilledrectangle($im, $x, 9, 56, 16, $black);
289 ImageString($im,$font,$x,9,$l1,$white);
290 }
291 if ($l2) {
292 imagefilledrectangle($im, $x, 19, 56, 26, $black);
293 ImageString($im,$font,$x,19,$l2,$white);
294 }
295 if ($l3) {
296 imagefilledrectangle($im, $x, 29, 56, 36, $black);
297 ImageString($im,$font,$x,29,substr($l3,-14),$white);
298 }
299
300 // Outputting the image stream and exit
301 if ($TYPO3_CONF_VARS['GFX']['gdlib_png']) {
302 imagePng($im);
303 } else {
304 imageGif($im);
305 }
306 imagedestroy($im);
307 exit;
308 }
309
310 /**
311 * Creates a font-preview thumbnail.
312 * This means a PNG/GIF file with the text "AaBbCc...." set with the font-file given as input and in various sizes to show how the font looks
313 * Requires GD lib enabled.
314 * Outputs the image stream to browser and exits!
315 *
316 * @param string The filepath to the font file (absolute, probably)
317 * @return void
318 */
319 function fontGif($font) {
320 global $TYPO3_CONF_VARS;
321
322 if (!$TYPO3_CONF_VARS['GFX']['gdlib']) die('');
323
324 // Create image and set background color to white.
325 $im = ImageCreate(250,76);
326 $white = ImageColorAllocate($im, 255,255,255);
327 $col = ImageColorAllocate($im, 0,0,0);
328
329 // The test string and offset in x-axis.
330 $string = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÆæØøÅåÄäÖöÜüß';
331 $x=13;
332
333 // Print (with non-ttf font) the size displayed
334 imagestring ($im, 1, 0, 2, '10', $col);
335 imagestring ($im, 1, 0, 15, '12', $col);
336 imagestring ($im, 1, 0, 30, '14', $col);
337 imagestring ($im, 1, 0, 47, '18', $col);
338 imagestring ($im, 1, 0, 68, '24', $col);
339
340 // Print with ttf-font the test string
341 imagettftext ($im, t3lib_div::freetypeDpiComp(10), 0, $x, 8, $col, $font, $string);
342 imagettftext ($im, t3lib_div::freetypeDpiComp(12), 0, $x, 21, $col, $font, $string);
343 imagettftext ($im, t3lib_div::freetypeDpiComp(14), 0, $x, 36, $col, $font, $string);
344 imagettftext ($im, t3lib_div::freetypeDpiComp(18), 0, $x, 53, $col, $font, $string);
345 imagettftext ($im, t3lib_div::freetypeDpiComp(24), 0, $x, 74, $col, $font, $string);
346
347 // Output PNG or GIF based on $TYPO3_CONF_VARS['GFX']['gdlib_png']
348 if ($TYPO3_CONF_VARS['GFX']['gdlib_png']) {
349 Header('Content-type: image/png');
350 imagePng($im);
351 } else {
352 Header('Content-type: image/gif');
353 imageGif($im);
354 }
355 imagedestroy($im);
356 exit;
357 }
358
359 /**
360 * Wrapping the input filename in double-quotes
361 *
362 * @param string Input filename
363 * @return string The output wrapped in "" (if there are spaces in the filepath)
364 * @access private
365 */
366 function wrapFileName($inputName) {
367 if (strstr($inputName,' ')) {
368 $inputName='"'.$inputName.'"';
369 }
370 return $inputName;
371 }
372 }
373
374 // Include extension class?
375 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/thumbs.php']) {
376 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/thumbs.php']);
377 }
378
379
380
381
382 // Make instance:
383 $SOBE = t3lib_div::makeInstance('SC_t3lib_thumbs');
384 $SOBE->init();
385 $SOBE->main();
386 ?>