X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=upload.php;h=e349cf08439a567cd491264f7f9d2d5869d6bdd3;hb=fa9853503d584b6373257df6b66c79c8ec5290df;hp=0f2a237a0d994170ebf859ff60ba39af5444ca06;hpb=22d5fb7ab7d4ee86bd59e194387dca268bd577a1;p=wfpl.git diff --git a/upload.php b/upload.php index 0f2a237..e349cf0 100644 --- a/upload.php +++ b/upload.php @@ -60,11 +60,11 @@ # the type you specified, it will convert the image for you. - $GLOBALS['mime_to_ext'] = array( 'text/plain' => 'txt', 'text/html' => 'html', 'image/jpeg' => 'jpg', + 'image/jpe' => 'jpg', 'image/jpg' => 'jpg', 'image/gif' => 'gif', 'image/png' => 'png', @@ -116,7 +116,7 @@ function generate_filename($path, $mime = 'text/plain') { # replace symbols with underscores $filename = ereg_replace('[^a-z0-9_.]', '_', $filename); - # remove dots from the begning (no invisible files) + # remove dots from the beginning (no invisible files) $filename = ereg_replace('^\.*', '', $filename); # fix extension @@ -156,12 +156,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($convert = "/usr/local/bin/$prog") || + file_exists($convert = "/usr/bin/$prog") || + ($convert = `which convert` != '' && file_exists($convert))) { + return $convert; + } 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') { @@ -174,17 +209,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(!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); @@ -195,6 +221,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 = substr(`$command`, 0, -1); # substr() to remove newline + 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.