Skip to content
This repository was archived by the owner on Sep 10, 2021. It is now read-only.

Commit 169f6b1

Browse files
author
Jamie Snape
committed
Fix issue with thumbnail creation on App Engine
1 parent 4664be6 commit 169f6b1

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed

modules/thumbnailcreator/controllers/components/ImagemagickComponent.php

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,170 @@
2020

2121
include_once BASE_PATH.'/library/KWUtils.php';
2222

23+
if (extension_loaded('fileinfo') === false) {
24+
define('FILEINFO_NONE', 0);
25+
define('FILEINFO_SYMLINK', 2);
26+
define('FILEINFO_DEVICES', 8);
27+
define('FILEINFO_CONTINUE', 32);
28+
define('FILEINFO_PRESERVE_ATIME', 128);
29+
define('FILEINFO_RAW', 256);
30+
define('FILEINFO_MIME_TYPE', 16);
31+
define('FILEINFO_MIME_ENCODING', 1024);
32+
define('FILEINFO_MIME', 1040);
33+
34+
/**
35+
* Return information about a given string.
36+
*
37+
* @param null|int|resource $finfo fileinfo resource
38+
* @param null|string $string content of the file to be checked
39+
* @param int $options fileinfo constant (FILEINFO_NONE | FILEINFO_MIME_TYPE | FILEINFO_MIME_ENCODING | FILEINFO_MIME)
40+
* @param null|resource $context context (not implemented)
41+
* @return false|string a textual description of the given string or false on failure
42+
*/
43+
function finfo_buffer($finfo, $string = null, $options = FILEINFO_NONE, $context = null)
44+
{
45+
if ($finfo !== false && !is_null($string) && is_null($context)) {
46+
if ($options === FILEINFO_NONE && ($finfo & FILEINFO_MIME_TYPE === FILEINFO_MIME_TYPE || $finfo & FILEINFO_MIME_ENCODING === FILEINFO_MIME_ENCODING)) {
47+
$options = $finfo;
48+
}
49+
50+
if ($options & FILEINFO_MIME_TYPE === FILEINFO_MIME_TYPE || $options & FILEINFO_MIME_ENCODING === FILEINFO_MIME_ENCODING) {
51+
if (substr($string, 8) === "\x89PNG\x0d\x0a\x1a\x0a") {
52+
$mimeType = 'image/png';
53+
} elseif (substr($string, 6) === 'GIF87a' || substr($string, 6) === 'GIF89a') {
54+
$mimeType = 'image/gif';
55+
} elseif (substr($string, 4) === "MM\x00\x2a" || substr($string, 4) === "II\x2a\x00") {
56+
$mimeType = 'image/tiff';
57+
} elseif (substr($string, 4) === '8BPS') {
58+
$mimeType = 'image/vnd.adobe.photoshop';
59+
} elseif (substr($string, 3) === "\xFF\xD8\xFF") {
60+
$mimeType = 'image/jpeg';
61+
} elseif (substr($string, 2) === 'BM') {
62+
$mimeType = 'image/bmp';
63+
} else {
64+
return false;
65+
}
66+
67+
if ($options & FILEINFO_MIME === FILEINFO_MIME) {
68+
return $mimeType.'; charset=binary';
69+
}
70+
71+
if ($options & FILEINFO_MIME_TYPE === FILEINFO_MIME_TYPE) {
72+
return $mimeType;
73+
}
74+
75+
return 'binary';
76+
}
77+
}
78+
79+
return false;
80+
}
81+
82+
/**
83+
* Close a given fileinfo resource.
84+
*
85+
* @param null|resource $finfo fileinfo resource
86+
* @return bool true on success or false on failure
87+
*/
88+
function finfo_close($finfo)
89+
{
90+
return $finfo !== false;
91+
}
92+
93+
/**
94+
* Return information about a given file.
95+
*
96+
* @param null|int|resource $finfo fileinfo resource
97+
* @param null|string $filename name of the file to be checked
98+
* @param int $options fileinfo constant (FILEINFO_NONE | FILEINFO_MIME_TYPE | FILEINFO_MIME_ENCODING | FILEINFO_MIME)
99+
* @param null|resource $context context (partially implemented)
100+
* @return false|string a textual description of the contents of the given file or false on failure
101+
*/
102+
function finfo_file($finfo, $filename = null, $options = FILEINFO_NONE, $context = null)
103+
{
104+
if ($finfo !== false && !is_null($filename)) {
105+
if ($options === FILEINFO_NONE && ($finfo & FILEINFO_MIME_TYPE === FILEINFO_MIME_TYPE || $finfo & FILEINFO_MIME_ENCODING === FILEINFO_MIME_ENCODING)) {
106+
$options = $finfo;
107+
}
108+
109+
if ($options & FILEINFO_MIME_TYPE === FILEINFO_MIME_TYPE || $options & FILEINFO_MIME_ENCODING === FILEINFO_MIME_ENCODING) {
110+
$mimeType = finfo_buffer($finfo, file_get_contents($filename, false, $context), $options, $context);
111+
112+
if ($mimeType === false) {
113+
$extension = strtolower(end(explode('.', basename($filename))));
114+
115+
switch ($extension) {
116+
case 'bmp':
117+
$mimeType = 'image/bmp';
118+
break;
119+
case 'gif':
120+
$mimeType = 'image/gif';
121+
break;
122+
case 'ico':
123+
$mimeType = 'image/x-icon';
124+
break;
125+
case 'jpe':
126+
case 'jpeg':
127+
case 'jpg':
128+
$mimeType = 'image/jpeg';
129+
break;
130+
case 'png':
131+
$mimeType = 'image/png';
132+
break;
133+
case 'psd':
134+
$mimeType = 'image/vnd.adobe.photoshop';
135+
break;
136+
case 'tif':
137+
case 'tiff':
138+
$mimeType = 'image/tiff';
139+
break;
140+
default:
141+
return false;
142+
}
143+
144+
if ($options & FILEINFO_MIME === FILEINFO_MIME) {
145+
return $mimeType.'; charset=binary';
146+
}
147+
148+
if ($options & FILEINFO_MIME_TYPE === FILEINFO_MIME_TYPE) {
149+
return $mimeType;
150+
}
151+
152+
return 'binary';
153+
}
154+
155+
return $mimeType;
156+
}
157+
}
158+
159+
return false;
160+
}
161+
162+
/**
163+
* Create a new fileinfo resource.
164+
*
165+
* @param int $options fileinfo constant (FILEINFO_NONE | FILEINFO_MIME_TYPE | FILEINFO_MIME_ENCODING | FILEINFO_MIME)
166+
* @param null|string $magic name of a magic database file (not implemented)
167+
* @return null|int|resource a fileinfo resource on success or false on failure.
168+
*/
169+
function finfo_open($options = FILEINFO_NONE, $magic = null)
170+
{
171+
return is_null($magic) ? $options : false;
172+
}
173+
174+
/**
175+
* Set the magic configuration options (not implemented).
176+
*
177+
* @param null|int|resource $finfo fileinfo resource
178+
* @param int $options fileinfo constant (FILEINFO_NONE | FILEINFO_MIME_TYPE | FILEINFO_MIME_ENCODING | FILEINFO_MIME)
179+
* @return bool true on success or false on failure
180+
*/
181+
function finfo_set_flags($finfo, $options)
182+
{
183+
return $finfo === $options;
184+
}
185+
}
186+
23187
/** Component used to create thumbnails using phMagick library (on top of ImageMagick) */
24188
class Thumbnailcreator_ImagemagickComponent extends AppComponent
25189
{

0 commit comments

Comments
 (0)