JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix db_get_value after mysql->mysqli upgrade
[wfpl.git] / upload.php
index e9ff5db..b21af6f 100644 (file)
@@ -1,19 +1,9 @@
 <?php
 
-#  Copyright (C) 2007 Jason Woofenden
-#
-#  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 program is in the public domain within the United States. Additionally,
+# we waive copyright and related rights in the work worldwide through the CC0
+# 1.0 Universal public domain dedication, which can be found at
+# http://creativecommons.org/publicdomain/zero/1.0/
 
 
 # This file contains functions to accept files being uplodad with the <input
@@ -90,11 +80,44 @@ function upload_max_filesize() {
        }
 }
 
+# return the extension this path should have WITHOUT the period
+function path_or_mime_to_ext($path, $mime = 'text/plain', $default = 'txt') {
+       $last_dot = strrpos($path, '.');
+       if($last_dot === false || $last_dot === 0 || $last_dot === (strlen($path) - 1)) {
+               # no extension
+               if(isset($GLOBALS['mime_to_ext'][$mime])) {
+                       return $GLOBALS['mime_to_ext'][$mime];
+               } else {
+                       return $default;
+               }
+       } else {
+               $ext = strtolower(substr($path, $last_dot + 1));
+               if(isset($GLOBALS['ext_to_ext'][$ext])) {
+                       return $GLOBALS['ext_to_ext'][$ext];
+               }
+               return $ext;
+       }
+}
+
+# Add or fix extension on path
+# This just does string manipulation (ie  doesn't move/open/etc any files.)
+# Mime type used to generate extension ONLY IF it doesn't have one already.
+function path_fix_ext($path, $mime = 'text/plain', $default_ext = '.txt') {
+       $last_dot = strrpos($path, '.');
+       if($last_dot === false || $last_dot === 0) { # no extension
+               $path .= '.' . path_or_mime_to_ext($path, $mime, $default_ext);
+       } else {
+               $basename = substr($path, 0, $last_dot + 1); # keep dot
+               $path = $basename . path_or_mime_to_ext($path, $mime, $default_ext);
+       }
+
+       return $path;
+}
 
 # pass in the client's path that came from an html <input type="file"/> tag
 #
 # mime time used to generate extension ONLY IF it doesn't have one already.
-function generate_filename($path, $mime = 'text/plain') {
+function generate_filename($path, $mime = 'text/plain', $default_ext = '.txt') {
        # lower case
        $filename = strtolower($path);
 
@@ -113,30 +136,21 @@ function generate_filename($path, $mime = 'text/plain') {
        # replace symbols with underscores
        $filename = preg_replace('|[^a-z0-9_.]|', '_', $filename);
 
-       # remove dots from the beginning (no invisible files)
-       $filename = preg_replace('|^\.*|', '', $filename);
-
+       # limit length
        if(strlen($filename > 80)) {
                $filename = substr($filename, -80);
        }
 
-       # fix extension
-       $last_dot = strrpos($filename, '.');
-       if($last_dot === false) {
-               #no extension
-               if(isset($GLOBALS['mime_to_ext'][$mime])) {
-                       $filename .= '.' . $GLOBALS['mime_to_ext'][$mime];
-               } else {
-                       $filename .= '.bin';
-               }
-       } else {
-               $basename = substr($filename, 0, $last_dot);
-               $ext = substr($filename, $last_dot + 1);
-               if(isset($GLOBALS['ext_to_ext'][$ext])) {
-                       $ext .= $GLOBALS['ext_to_ext'][$ext];
-               }
-               $filename = $basename . '.' . $ext;
+       # remove dots from the beginning (no invisible files)
+       $filename = preg_replace('|^\.*|', '', $filename);
+
+       # make sure there's something before the extension
+       if ($filename == '') {
+               return '_';
        }
+
+       $filename = path_fix_ext($filename, $mime, $default_ext);
+
        return $filename;
 }
 
@@ -224,7 +238,7 @@ function gif_to_png($filename, $new_filename = 'just change extension') {
                $new_filename .= '.png';
        }
 
-       imagemagick_convert($filename, $new_filename, "-colorspace sRGB", 'GIF to PNG conversion');
+       imagemagick_convert($filename.'[0]', $new_filename, "-colorspace sRGB", 'GIF to PNG conversion');
 
        unlink($filename);
        return $new_filename;
@@ -396,7 +410,7 @@ function convert_uploaded_image($key, $path, $image_width = 0, $image_height = 0
        if($image_width > 0 && $image_height > 0) {
                $convert_params .= " -geometry ${image_width}x$image_height";
        }
-       imagemagick_convert($tmp_filename, $filename, $convert_params);
+       imagemagick_convert($tmp_filename.'[0]', $filename, $convert_params);
        unlink($tmp_filename);
        list($w, $h) = image_w_h_or_die($filename);
        $ret = "$filename $w $h";