Piwigo/admin/include/functions_upload.inc.php
plegall 796b6b3ffe feature 2606: second step on multiple size configuration screen redesign.
Configuration settings are saved on form submission.

The old screen is still available for tests.

Default resize quality set to 95 instead of 85.


git-svn-id: http://piwigo.org/svn/trunk@14221 68402e56-0260-453c-a942-63ccdbb3a9ee
2012-04-19 14:43:30 +00:00

568 lines
No EOL
14 KiB
PHP

<?php
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008-2012 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
// | |
// | 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, write to the Free Software |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
include_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
// add default event handler for image and thumbnail resize
add_event_handler('upload_image_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 7);
add_event_handler('upload_thumbnail_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 9);
function get_upload_form_config()
{
// default configuration for upload
$upload_form_config = array(
'original_resize' => array(
'default' => false,
'can_be_null' => false,
),
'original_resize_maxwidth' => array(
'default' => 2000,
'min' => 500,
'max' => 20000,
'pattern' => '/^\d+$/',
'can_be_null' => false,
'error_message' => l10n('The original maximum width must be a number between %d and %d'),
),
'original_resize_maxheight' => array(
'default' => 2000,
'min' => 300,
'max' => 20000,
'pattern' => '/^\d+$/',
'can_be_null' => false,
'error_message' => l10n('The original maximum height must be a number between %d and %d'),
),
'original_resize_quality' => array(
'default' => 95,
'min' => 50,
'max' => 98,
'pattern' => '/^\d+$/',
'can_be_null' => false,
'error_message' => l10n('The original image quality must be a number between %d and %d'),
),
);
return $upload_form_config;
}
function save_upload_form_config($data, &$errors=array(), &$form_errors=array())
{
if (!is_array($data) or empty($data))
{
return false;
}
$upload_form_config = get_upload_form_config();
$updates = array();
foreach ($data as $field => $value)
{
if (!isset($upload_form_config[$field]))
{
continue;
}
if (is_bool($upload_form_config[$field]['default']))
{
if (isset($value))
{
$value = true;
}
else
{
$value = false;
}
$updates[] = array(
'param' => $field,
'value' => boolean_to_string($value)
);
}
elseif ($upload_form_config[$field]['can_be_null'] and empty($value))
{
$updates[] = array(
'param' => $field,
'value' => 'false'
);
}
else
{
$min = $upload_form_config[$field]['min'];
$max = $upload_form_config[$field]['max'];
$pattern = $upload_form_config[$field]['pattern'];
if (preg_match($pattern, $value) and $value >= $min and $value <= $max)
{
$updates[] = array(
'param' => $field,
'value' => $value
);
}
else
{
array_push(
$errors,
sprintf(
$upload_form_config[$field]['error_message'],
$min,
$max
)
);
$form_errors[$field] = '['.$min.' .. '.$max.']';
}
}
}
if (count($errors) == 0)
{
mass_updates(
CONFIG_TABLE,
array(
'primary' => array('param'),
'update' => array('value')
),
$updates
);
return true;
}
return false;
}
function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null, $image_id=null, $original_md5sum=null)
{
// 1) move uploaded file to upload/2010/01/22/20100122003814-449ada00.jpg
//
// 2) keep/resize original
//
// 3) register in database
// TODO
// * check md5sum (already exists?)
global $conf, $user;
if (isset($original_md5sum))
{
$md5sum = $original_md5sum;
}
else
{
$md5sum = md5_file($source_filepath);
}
$file_path = null;
if (isset($image_id))
{
// this photo already exists, we update it
$query = '
SELECT
path
FROM '.IMAGES_TABLE.'
WHERE id = '.$image_id.'
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$file_path = $row['path'];
}
if (!isset($file_path))
{
die('['.__FUNCTION__.'] this photo does not exist in the database');
}
// delete all physical files related to the photo (thumbnail, web site, HD)
delete_element_files(array($image_id));
}
else
{
// this photo is new
// current date
list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
list($year, $month, $day) = preg_split('/[^\d]/', $dbnow, 4);
// upload directory hierarchy
$upload_dir = sprintf(
PHPWG_ROOT_PATH.$conf['upload_dir'].'/%s/%s/%s',
$year,
$month,
$day
);
// compute file path
$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.'.';
list($width, $height, $type) = getimagesize($source_filepath);
if (IMAGETYPE_PNG == $type)
{
$file_path.= 'png';
}
elseif (IMAGETYPE_GIF == $type)
{
$file_path.= 'gif';
}
else
{
$file_path.= 'jpg';
}
prepare_directory($upload_dir);
}
if (is_uploaded_file($source_filepath))
{
move_uploaded_file($source_filepath, $file_path);
}
else
{
rename($source_filepath, $file_path);
}
if (pwg_image::get_library() != 'gd')
{
if ($conf['original_resize'])
{
$need_resize = need_resize($file_path, $conf['original_resize_maxwidth'], $conf['original_resize_maxheight']);
if ($need_resize)
{
$img = new pwg_image($file_path);
$img->pwg_resize(
$file_path,
$conf['original_resize_maxwidth'],
$conf['original_resize_maxheight'],
$conf['original_resize_quality'],
$conf['upload_form_automatic_rotation'],
false
);
$img->destroy();
}
}
}
// we need to save the rotation angle in the database to compute
// width/height of "multisizes"
$rotation_angle = pwg_image::get_rotation_angle($file_path);
$rotation = pwg_image::get_rotation_code_from_angle($rotation_angle);
$file_infos = pwg_image_infos($file_path);
if (isset($image_id))
{
$update = array(
'file' => pwg_db_real_escape_string(isset($original_filename) ? $original_filename : basename($file_path)),
'filesize' => $file_infos['filesize'],
'width' => $file_infos['width'],
'height' => $file_infos['height'],
'md5sum' => $md5sum,
'added_by' => $user['id'],
'rotation' => $rotation,
);
if (isset($level))
{
$update['level'] = $level;
}
single_update(
IMAGES_TABLE,
$update,
array('id' => $image_id)
);
}
else
{
// database registration
$file = pwg_db_real_escape_string(isset($original_filename) ? $original_filename : basename($file_path));
$insert = array(
'file' => $file,
'name' => get_name_from_file($file),
'date_available' => $dbnow,
'path' => preg_replace('#^'.preg_quote(PHPWG_ROOT_PATH).'#', '', $file_path),
'filesize' => $file_infos['filesize'],
'width' => $file_infos['width'],
'height' => $file_infos['height'],
'md5sum' => $md5sum,
'added_by' => $user['id'],
'rotation' => $rotation,
);
if (isset($level))
{
$insert['level'] = $level;
}
single_insert(IMAGES_TABLE, $insert);
$image_id = pwg_db_insert_id(IMAGES_TABLE);
}
if (isset($categories) and count($categories) > 0)
{
associate_images_to_categories(
array($image_id),
$categories
);
}
// update metadata from the uploaded file (exif/iptc)
if ($conf['use_exif'] and !function_exists('read_exif_data'))
{
$conf['use_exif'] = false;
}
sync_metadata(array($image_id));
invalidate_user_cache();
// cache thumbnail
$query = '
SELECT
id,
path
FROM '.IMAGES_TABLE.'
WHERE id = '.$image_id.'
;';
$image_infos = pwg_db_fetch_assoc(pwg_query($query));
set_make_full_url();
// in case we are on uploadify.php, we have to replace the false path
$thumb_url = preg_replace('#admin/include/i#', 'i', DerivativeImage::thumb_url($image_infos));
unset_make_full_url();
fetchRemote($thumb_url, $dest);
return $image_id;
}
function prepare_directory($directory)
{
if (!is_dir($directory)) {
if (substr(PHP_OS, 0, 3) == 'WIN')
{
$directory = str_replace('/', DIRECTORY_SEPARATOR, $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)
{
// TODO : the resize check should take the orientation into account. If a
// rotation must be applied to the resized photo, then we should test
// invert width and height.
list($width, $height) = getimagesize($image_filepath);
if ($width > $max_width or $height > $max_height)
{
return true;
}
return false;
}
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', 'gif'));
}
function file_upload_error_message($error_code)
{
switch ($error_code) {
case UPLOAD_ERR_INI_SIZE:
return sprintf(
l10n('The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'),
get_ini_size('upload_max_filesize', false)
);
case UPLOAD_ERR_FORM_SIZE:
return l10n('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form');
case UPLOAD_ERR_PARTIAL:
return l10n('The uploaded file was only partially uploaded');
case UPLOAD_ERR_NO_FILE:
return l10n('No file was uploaded');
case UPLOAD_ERR_NO_TMP_DIR:
return l10n('Missing a temporary folder');
case UPLOAD_ERR_CANT_WRITE:
return l10n('Failed to write file to disk');
case UPLOAD_ERR_EXTENSION:
return l10n('File upload stopped by extension');
default:
return l10n('Unknown upload error');
}
}
function get_ini_size($ini_key, $in_bytes=true)
{
$size = ini_get($ini_key);
if ($in_bytes)
{
$size = convert_shorthand_notation_to_bytes($size);
}
return $size;
}
function convert_shorthand_notation_to_bytes($value)
{
$suffix = substr($value, -1);
$multiply_by = null;
if ('K' == $suffix)
{
$multiply_by = 1024;
}
else if ('M' == $suffix)
{
$multiply_by = 1024*1024;
}
else if ('G' == $suffix)
{
$multiply_by = 1024*1024*1024;
}
if (isset($multiply_by))
{
$value = substr($value, 0, -1);
$value*= $multiply_by;
}
return $value;
}
function add_upload_error($upload_id, $error_message)
{
if (!isset($_SESSION['uploads_error']))
{
$_SESSION['uploads_error'] = array();
}
if (!isset($_SESSION['uploads_error'][$upload_id]))
{
$_SESSION['uploads_error'][$upload_id] = array();
}
array_push($_SESSION['uploads_error'][$upload_id], $error_message);
}
function ready_for_upload_message()
{
global $conf;
$relative_dir = preg_replace('#^'.PHPWG_ROOT_PATH.'#', '', $conf['upload_dir']);
if (!is_dir($conf['upload_dir']))
{
if (!is_writable(dirname($conf['upload_dir'])))
{
return sprintf(
l10n('Create the "%s" directory at the root of your Piwigo installation'),
$relative_dir
);
}
}
else
{
if (!is_writable($conf['upload_dir']))
{
@chmod($conf['upload_dir'], 0777);
if (!is_writable($conf['upload_dir']))
{
return sprintf(
l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
$relative_dir
);
}
}
}
return null;
}
function file_path_for_type($file_path, $type='thumb')
{
// resolve the $file_path depending on the $type
if ('thumb' == $type) {
$file_path = get_thumbnail_location(
array(
'path' => $file_path,
'tn_ext' => 'jpg',
)
);
}
if ('high' == $type) {
@include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
$file_path = get_high_location(
array(
'path' => $file_path,
'has_high' => 'true'
)
);
}
return $file_path;
}
?>