aboutsummaryrefslogtreecommitdiffstats
path: root/admin/include/functions_upload.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'admin/include/functions_upload.inc.php')
-rw-r--r--admin/include/functions_upload.inc.php264
1 files changed, 264 insertions, 0 deletions
diff --git a/admin/include/functions_upload.inc.php b/admin/include/functions_upload.inc.php
new file mode 100644
index 000000000..39259ad34
--- /dev/null
+++ b/admin/include/functions_upload.inc.php
@@ -0,0 +1,264 @@
+<?php
+// TODO
+// * check md5sum (already exists?)
+
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/ws_functions.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// Here is the plan
+//
+// 1) move uploaded file to upload/2010/01/22/20100122003814-449ada00.jpg
+//
+// 2) if taller than max_height or wider than max_width, move to pwg_high
+// + web sized creation
+//
+// 3) thumbnail creation from web sized
+//
+// 4) register in database
+
+function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null)
+{
+ global $conf;
+
+ // current date
+ list($dbnow) = mysql_fetch_row(pwg_query('SELECT NOW();'));
+ list($year, $month, $day) = preg_split('/[^\d]/', $dbnow, 4);
+
+ // upload directory hierarchy
+ $upload_dir = sprintf(
+ PHPWG_ROOT_PATH.'upload/%s/%s/%s',
+ $year,
+ $month,
+ $day
+ );
+
+ // compute file path
+ $md5sum = md5_file($source_filepath);
+ $date_string = preg_replace('/[^\d]/', '', $dbnow);
+ $random_string = substr($md5sum, 0, 8);
+ $filename_wo_ext = $date_string.'-'.$random_string;
+ $file_path = $upload_dir.'/'.$filename_wo_ext.'.jpg';
+
+ prepare_directory($upload_dir);
+ if (is_uploaded_file($source_filepath))
+ {
+ move_uploaded_file($source_filepath, $file_path);
+ }
+ else
+ {
+ copy($source_filepath, $file_path);
+ }
+
+ if ($conf['upload_form_websize_resize']
+ and need_resize($file_path, $conf['upload_form_websize_maxwidth'], $conf['upload_form_websize_maxheight']))
+ {
+ $high_path = file_path_for_type($file_path, 'high');
+ $high_dir = dirname($high_path);
+ prepare_directory($high_dir);
+
+ rename($file_path, $high_path);
+ $high_infos = pwg_image_infos($high_path);
+
+ pwg_image_resize(
+ $high_path,
+ $file_path,
+ $conf['upload_form_websize_maxwidth'],
+ $conf['upload_form_websize_maxheight'],
+ $conf['upload_form_websize_quality']
+ );
+ }
+
+ $file_infos = pwg_image_infos($file_path);
+
+ $thumb_path = file_path_for_type($file_path, 'thumb');
+ $thumb_dir = dirname($thumb_path);
+ prepare_directory($thumb_dir);
+
+ pwg_image_resize(
+ $file_path,
+ $thumb_path,
+ $conf['upload_form_thumb_maxwidth'],
+ $conf['upload_form_thumb_maxheight'],
+ $conf['upload_form_thumb_quality']
+ );
+
+ $thumb_infos = pwg_image_infos($thumb_path);
+
+ // database registration
+ $insert = array(
+ 'file' => isset($original_filename) ? $original_filename : basename($file_path),
+ 'date_available' => $dbnow,
+ 'tn_ext' => 'jpg',
+ 'path' => preg_replace('/^.*?upload/', './upload', $file_path),
+ 'filesize' => $file_infos['filesize'],
+ 'width' => $file_infos['width'],
+ 'height' => $file_infos['height'],
+ 'md5sum' => $md5sum,
+ );
+
+ if (isset($high_infos))
+ {
+ $insert['has_high'] = 'true';
+ $insert['high_filesize'] = $high_infos['filesize'];
+ }
+
+ if (isset($level))
+ {
+ $insert['level'] = $level;
+ }
+
+ mass_inserts(
+ IMAGES_TABLE,
+ array_keys($insert),
+ array($insert)
+ );
+
+ $image_id = mysql_insert_id();
+
+ if (isset($categories) and count($categories) > 0)
+ {
+ associate_images_to_categories(
+ array($image_id),
+ $categories
+ );
+ }
+
+ // update metadata from the uploaded file (exif/iptc)
+ update_metadata(array($image_id=>$file_path));
+
+ invalidate_user_cache();
+
+ return $image_id;
+}
+
+function prepare_directory($directory)
+{
+ if (!is_dir($directory)) {
+ umask(0000);
+ $recursive = true;
+ if (!@mkdir($directory, 0777, $recursive))
+ {
+ die('[prepare_directory] cannot create directory "'.$directory.'"');
+ }
+ }
+
+ if (!is_writable($directory))
+ {
+ // last chance to make the directory writable
+ @chmod($directory, 0777);
+
+ if (!is_writable($directory))
+ {
+ die('[prepare_directory] directory "'.$directory.'" has no write access');
+ }
+ }
+
+ secure_directory($directory);
+}
+
+function need_resize($image_filepath, $max_width, $max_height)
+{
+ list($width, $height) = getimagesize($image_filepath);
+
+ if ($width > $max_width or $height > $max_height)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+function pwg_image_resize($source_filepath, $destination_filepath, $max_width, $max_height, $quality)
+{
+ if (!function_exists('gd_info'))
+ {
+ return false;
+ }
+
+ // extension of the picture filename
+ $extension = strtolower(get_extension($source_filepath));
+
+ $source_image = null;
+ if (in_array($extension, array('jpg', 'jpeg')))
+ {
+ $source_image = @imagecreatefromjpeg($source_filepath);
+ }
+ else if ($extension == 'png')
+ {
+ $source_image = @imagecreatefrompng($source_filepath);
+ }
+ else
+ {
+ die('unsupported file extension');
+ }
+
+ // width/height
+ $source_width = imagesx($source_image);
+ $source_height = imagesy($source_image);
+
+ $ratio_width = $source_width / $max_width;
+ $ratio_height = $source_height / $max_height;
+
+ // maximal size exceeded ?
+ if ($ratio_width > 1 or $ratio_height > 1)
+ {
+ if ($ratio_width < $ratio_height)
+ {
+ $destination_width = ceil($source_width / $ratio_height);
+ $destination_height = $max_height;
+ }
+ else
+ {
+ $destination_width = $max_width;
+ $destination_height = ceil($source_height / $ratio_width);
+ }
+ }
+ else
+ {
+ // the image doesn't need any resize! We just copy it to the destination
+ copy($source_filepath, $destination_filepath);
+ return true;
+ }
+
+ $destination_image = imagecreatetruecolor($destination_width, $destination_height);
+
+ imagecopyresampled(
+ $destination_image,
+ $source_image,
+ 0,
+ 0,
+ 0,
+ 0,
+ $destination_width,
+ $destination_height,
+ $source_width,
+ $source_height
+ );
+
+ imagejpeg($destination_image, $destination_filepath, $quality);
+ // freeing memory ressources
+ imagedestroy($source_image);
+ imagedestroy($destination_image);
+
+ // everything should be OK if we are here!
+ return true;
+}
+
+function pwg_image_infos($path)
+{
+ list($width, $height) = getimagesize($path);
+ $filesize = floor(filesize($path)/1024);
+
+ return array(
+ 'width' => $width,
+ 'height' => $height,
+ 'filesize' => $filesize,
+ );
+}
+
+function is_valid_image_extension($extension)
+{
+ return in_array(strtolower($extension), array('jpg', 'jpeg', 'png'));
+}
+?> \ No newline at end of file