JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
re-licensed under GPLv3
[wfpl.git] / upload.php
index 143482c..1bca71a 100644 (file)
@@ -2,21 +2,18 @@
 
 #  Copyright (C) 2007 Jason Woofenden
 #
-#  This file is part of wfpl.
-#
-#  wfpl is free software; you can redistribute it and/or modify it under the
-#  terms of the GNU Lesser General Public License as published by the Free
-#  Software Foundation; either version 2.1 of the License, or (at your option)
-#  any later version.
-#
-#  wfpl is distributed in the hope that it will be useful, but WITHOUT ANY
-#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-#  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
-#  more details.
-#
-#  You should have received a copy of the GNU Lesser General Public License
-#  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
-#  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#  
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#  
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # This file contains functions to accept files being uplodad with the <input
@@ -60,7 +57,6 @@
 # the type you specified, it will convert the image for you.
 
 
-
 $GLOBALS['mime_to_ext'] = array(
        'text/plain' => 'txt',
        'text/html'  => 'html',
@@ -157,12 +153,47 @@ function save_uploaded_file($key, $path) {
        }
 
        if(!move_uploaded_file($_FILES[$key]['tmp_name'], $filename)) {
-               die('file upload failed');
+               return false;
        }
 
        return $filename;
 }
 
+# this function exists to deal with cases where binaries are installed in very
+# standard places (like /usr/bin or /usr/local bin) and PHP's PATH environment
+# variable is not set appropriately.
+function path_to($prog, $or_die = true) {
+       $prog = ereg_replace('[^a-zA-Z0-9_.-]', '', $prog);
+       $prog = ereg_replace('^[-.]*', '', $prog);
+       if($prog == '') {
+               die('Invalid argument to path_to()');
+       }
+
+       if(!isset($GLOBALS["path_to_$prog"])) {
+               $ret = _path_to($prog, $or_die);
+               if($ret == false) {
+                       return false;
+               }
+               $GLOBALS["path_to_$prog"] = $ret;
+       }
+
+       return $GLOBALS["path_to_$prog"];
+}
+       
+function _path_to($prog, $or_die) {
+       # relies on PHP's short-circuit mechanism
+       if(file_exists($path = "/usr/local/bin/$prog") ||
+          file_exists($path = "/usr/bin/$prog") ||
+          ($path = `which $prog` != '' && file_exists($path))) {
+               return $path;
+       } else {
+               if($or_die) {
+                       die("Failed to locate '$prog' executable.");
+               }
+               return false;
+       }
+}
+
 
 # returns new filename with .png extension
 function gif_to_png($filename, $new_filename = 'just change extension') {
@@ -175,17 +206,8 @@ function gif_to_png($filename, $new_filename = 'just change extension') {
                $new_filename .= '.png';
        }
 
-       $convert = '/usr/local/bin/convert';
-       if(!file_exists($convert)) {
-               $convert = '/usr/bin/convert';
-       }
-       if(!file_exists($convert)) {
-               $convert = `which convert`;
-       }
-       if($convert == '' || !file_exists($convert)) {
-               die("can't find imagemagick's 'convert' program");
-       }
-               
+       $convert = path_to('convert');
+
        $command = "$convert " . escapeshellarg($filename) . ' ' . escapeshellarg($new_filename);
 
        exec($command, $dummy, $ret);
@@ -196,6 +218,61 @@ function gif_to_png($filename, $new_filename = 'just change extension') {
        return $new_filename;
 }
 
+# make a thumbnail image.
+#
+# Thumbnail will have the same filename, except "_thumb" will be added right
+# before the dot preceding the extension. so foo.png yields foo_thumb.png
+#
+# Thumbnail will retain aspect ratio, and be either $max_width wide or
+# $max_height tall (or, if the aspect is just right, both)
+function make_thumbnail($filename, $max_width = '70', $max_height = '70') {
+       $last_dot = strrpos($filename, '.');
+       if($last_dot === false) {
+               die("couldn't make thumbnail because filename has no extension.");
+       }
+
+       $thumb = substr($filename, 0, $last_dot);
+       $thumb .= '_thumb';
+       $thumb .= substr($filename, $last_dot);
+
+       $convert = path_to('convert');
+
+       # can't be too careful
+       $max_width = ereg_replace('[^0-9]', '', $max_width);
+       if($max_width == '') {
+               $max_width = '70';
+       }
+       $max_height = ereg_replace('[^0-9]', '', $max_height);
+       if($max_height == '') {
+               $max_height = '70';
+       }
+       
+       $command = "$convert -geometry ${max_width}x$max_height " . escapeshellarg($filename) . ' ' . escapeshellarg($thumb);
+
+       exec($command, $dummy, $ret);
+       if($ret != 0) {
+               die("Thumbnail creation failed. Convert called exit($ret)");
+       }
+
+       return $thumb;
+}
+
+# Argument: path to image file
+#
+# Return: string in the format WIDTHxHEIGHT, or boolean false
+#
+# Example: image_dimensions('uploads/foo.png'); ==> "124x58"
+function image_dimensions($image) {
+       $identify = path_to('identify');
+       $command = "$identify -format '%wx%h' " . escapeshellarg($image);
+       $dimensions = rtrim(`$command`);
+       if($dimensions == '') {
+               return false;
+       } else {
+               return $dimensions;
+       }
+}
+
 # like save_uploaded_file() (above) except it converts gifs to pngs.
 #
 # FIXME: if a filename is passed in the end of path, we should check if the file type matches, and if not run convert.