aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--admin/include/functions.php13
-rw-r--r--admin/include/functions_upload.inc.php25
-rw-r--r--include/ws_functions.inc.php291
-rw-r--r--ws.php1
4 files changed, 179 insertions, 151 deletions
diff --git a/admin/include/functions.php b/admin/include/functions.php
index f754f446a..1f09d69df 100644
--- a/admin/include/functions.php
+++ b/admin/include/functions.php
@@ -2307,4 +2307,17 @@ function clear_derivative_cache_rec($path, $pattern)
return $rmdir;
}
}
+
+function delete_element_derivatives($ids)
+{
+ // todo
+ if (!is_array($ids))
+ {
+ $ids = array($ids);
+ }
+
+ // for now I do a massive clear, to be removed once the function is
+ // properly implemented
+ clear_derivative_cache();
+}
?> \ No newline at end of file
diff --git a/admin/include/functions_upload.inc.php b/admin/include/functions_upload.inc.php
index da2e9b700..f53b2d09d 100644
--- a/admin/include/functions_upload.inc.php
+++ b/admin/include/functions_upload.inc.php
@@ -150,7 +150,7 @@ function save_upload_form_config($data, &$errors=array())
return false;
}
-function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null, $image_id=null)
+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
//
@@ -163,7 +163,15 @@ function add_uploaded_file($source_filepath, $original_filename=null, $categorie
global $conf, $user;
- $md5sum = md5_file($source_filepath);
+ if (isset($original_md5sum))
+ {
+ $md5sum = $original_md5sum;
+ }
+ else
+ {
+ $md5sum = md5_file($source_filepath);
+ }
+
$file_path = null;
if (isset($image_id))
@@ -234,7 +242,7 @@ SELECT
}
else
{
- copy($source_filepath, $file_path);
+ rename($source_filepath, $file_path);
}
if (pwg_image::get_library() != 'gd')
@@ -291,7 +299,6 @@ SELECT
$insert = array(
'file' => pwg_db_real_escape_string(isset($original_filename) ? $original_filename : basename($file_path)),
'date_available' => $dbnow,
- 'tn_ext' => 'jpg',
'path' => preg_replace('#^'.preg_quote(PHPWG_ROOT_PATH).'#', '', $file_path),
'filesize' => $file_infos['filesize'],
'width' => $file_infos['width'],
@@ -299,15 +306,7 @@ SELECT
'md5sum' => $md5sum,
'added_by' => $user['id'],
);
-
- if (isset($high_infos))
- {
- $insert['has_high'] = 'true';
- $insert['high_filesize'] = $high_infos['filesize'];
- $insert['high_width'] = $high_infos['width'];
- $insert['high_height'] = $high_infos['height'];
- }
-
+
if (isset($level))
{
$insert['level'] = $level;
diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php
index 068cf84b3..7216fc31c 100644
--- a/include/ws_functions.inc.php
+++ b/include/ws_functions.inc.php
@@ -1431,7 +1431,6 @@ function ws_images_add_chunk($params, &$service)
{
global $conf;
- ws_logfile('[ws_images_add_chunk] welcome');
// data
// original_sum
// type {thumb, file, high}
@@ -1569,6 +1568,40 @@ function merge_chunks($output_filepath, $original_sum, $type)
}
}
+/**
+ * Function introduced for Piwigo 2.4 and the new "multiple size"
+ * (derivatives) feature. As we only need the biggest sent photo as
+ * "original", we remove chunks for smaller sizes. We can't make it earlier
+ * in ws_images_add_chunk because at this moment we don't know which $type
+ * will be the biggest (we could remove the thumb, but let's use the same
+ * algorithm)
+ */
+function remove_chunks($original_sum, $type)
+{
+ global $conf;
+
+ $upload_dir = $conf['upload_dir'].'/buffer';
+ $pattern = '/'.$original_sum.'-'.$type.'/';
+ $chunks = array();
+
+ if ($handle = opendir($upload_dir))
+ {
+ while (false !== ($file = readdir($handle)))
+ {
+ if (preg_match($pattern, $file))
+ {
+ array_push($chunks, $upload_dir.'/'.$file);
+ }
+ }
+ closedir($handle);
+ }
+
+ foreach ($chunks as $chunk)
+ {
+ unlink($chunk);
+ }
+}
+
/*
* The $file_path must be the path of the basic "web sized" photo
* The $type value will automatically modify the $file_path to the corresponding file
@@ -1577,8 +1610,6 @@ function add_file($file_path, $type, $original_sum, $file_sum)
{
include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
- $file_path = file_path_for_type($file_path, $type);
-
$upload_dir = dirname($file_path);
if (substr(PHP_OS, 0, 3) == 'WIN')
{
@@ -1610,7 +1641,7 @@ function add_file($file_path, $type, $original_sum, $file_sum)
secure_directory($upload_dir);
- // merge the thumbnail
+ // merge the file
merge_chunks($file_path, $original_sum, $type);
chmod($file_path, 0644);
@@ -1633,9 +1664,10 @@ function add_file($file_path, $type, $original_sum, $file_sum)
function ws_images_addFile($params, &$service)
{
+ ws_logfile(__FUNCTION__.', input : '.var_export($params, true));
// image_id
// type {thumb, file, high}
- // sum
+ // sum -> not used currently (Piwigo 2.4)
global $conf;
if (!is_admin())
@@ -1650,60 +1682,82 @@ function ws_images_addFile($params, &$service)
}
//
- // what is the path?
+ // what is the path and other infos about the photo?
//
$query = '
SELECT
path,
- md5sum
+ file,
+ md5sum,
+ width,
+ height,
+ filesize
FROM '.IMAGES_TABLE.'
WHERE id = '.$params['image_id'].'
;';
- list($file_path, $original_sum) = pwg_db_fetch_row(pwg_query($query));
-
- // TODO only files added with web API can be updated with web API
+ $image = pwg_db_fetch_assoc(pwg_query($query));
- //
- // makes sure directories are there and call the merge_chunks
- //
- $infos = add_file($file_path, $params['type'], $original_sum, $params['sum']);
+ if ($image == null)
+ {
+ return new PwgError(404, "image_id not found");
+ }
- //
- // update basic metadata from file
- //
- $update = array();
+ // since Piwigo 2.4 and derivatives, we do not take the imported "thumb"
+ // into account
+ if ('thumb' == $params['type'])
+ {
+ remove_chunks($image['md5sum'], $type);
+ return true;
+ }
+ // since Piwigo 2.4 and derivatives, we only care about the "original"
+ $original_type = 'file';
if ('high' == $params['type'])
{
- $update['high_filesize'] = $infos['filesize'];
- $update['high_width'] = $infos['width'];
- $update['high_height'] = $infos['height'];
- $update['has_high'] = 'true';
+ $original_type = 'high';
}
+ $file_path = $conf['upload_dir'].'/buffer/'.$image['md5sum'].'-original';
+
+ merge_chunks($file_path, $image['md5sum'], $original_type);
+ chmod($file_path, 0644);
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+ // if we receive the "file", we only update the original if the "file" is
+ // bigger than current original
if ('file' == $params['type'])
{
- $update['filesize'] = $infos['filesize'];
- $update['width'] = $infos['width'];
- $update['height'] = $infos['height'];
+ $do_update = false;
+
+ $infos = pwg_image_infos($file_path);
+
+ foreach (array('width', 'height', 'filesize') as $image_info)
+ {
+ if ($infos[$image_info] > $image[$image_info])
+ {
+ $do_update = true;
+ }
+ }
+
+ if (!$do_update)
+ {
+ unlink($file_path);
+ return true;
+ }
}
- // we may have nothing to update at database level, for example with a
- // thumbnail update
- if (count($update) > 0)
- {
- $update['id'] = $params['image_id'];
+ $image_id = add_uploaded_file(
+ $file_path,
+ $image['file'],
+ null,
+ null,
+ $params['image_id'],
+ $image['md5sum'] // we force the md5sum to remain the same
+ );
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- mass_updates(
- IMAGES_TABLE,
- array(
- 'primary' => array('id'),
- 'update' => array_diff(array_keys($update), array('id'))
- ),
- array($update)
- );
- }
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ delete_element_derivatives($params['image_id']);
}
function ws_images_add($params, &$service)
@@ -1748,99 +1802,47 @@ SELECT
}
}
- if ($params['resize'])
+ // due to the new feature "derivatives" (multiple sizes) introduced for
+ // Piwigo 2.4, we only take the biggest photos sent on
+ // pwg.images.addChunk. If "high" is available we use it as "original"
+ // else we use "file".
+ remove_chunks($params['original_sum'], 'thumb');
+
+ if (isset($params['high_sum']))
{
- ws_logfile('[pwg.images.add] resize activated');
-
- // temporary file path
- $type = 'file';
- $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-'.$type;
-
- merge_chunks($file_path, $params['original_sum'], $type);
- chmod($file_path, 0644);
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
-
- $image_id = add_uploaded_file(
- $file_path,
- $params['original_filename']
- );
-
- // add_uploaded_file doesn't remove the original file in the buffer
- // directory if it was not uploaded as $_FILES
- unlink($file_path);
+ $original_type = 'high';
+ remove_chunks($params['original_sum'], 'file');
}
else
{
- // 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(
- $conf['upload_dir'].'/%s/%s/%s',
- $year,
- $month,
- $day
- );
-
- // compute file path
- $date_string = preg_replace('/[^\d]/', '', $dbnow);
- $random_string = substr($params['file_sum'], 0, 8);
- $filename_wo_ext = $date_string.'-'.$random_string;
- $file_path = $upload_dir.'/'.$filename_wo_ext.'.jpg';
-
- // add files
- $file_infos = add_file($file_path, 'file', $params['original_sum'], $params['file_sum']);
- $thumb_infos = add_file($file_path, 'thumb', $params['original_sum'], $params['thumbnail_sum']);
-
- if (isset($params['high_sum']))
- {
- $high_infos = add_file($file_path, 'high', $params['original_sum'], $params['high_sum']);
- }
-
- // database registration
- $insert = array(
- 'file' => !empty($params['original_filename']) ? $params['original_filename'] : $filename_wo_ext.'.jpg',
- 'date_available' => $dbnow,
- 'tn_ext' => 'jpg',
- 'name' => $params['name'],
- 'path' => $file_path,
- 'filesize' => $file_infos['filesize'],
- 'width' => $file_infos['width'],
- 'height' => $file_infos['height'],
- 'md5sum' => $params['original_sum'],
- 'added_by' => $user['id'],
- );
+ $original_type = 'file';
+ }
- if (isset($params['high_sum']))
- {
- $insert['has_high'] = 'true';
- $insert['high_filesize'] = $high_infos['filesize'];
- $insert['high_width'] = $high_infos['width'];
- $insert['high_height'] = $high_infos['height'];
- }
+ $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-original';
- single_insert(
- IMAGES_TABLE,
- $insert
- );
+ merge_chunks($file_path, $params['original_sum'], $original_type);
+ chmod($file_path, 0644);
- $image_id = pwg_db_insert_id(IMAGES_TABLE);
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
- // update metadata from the uploaded file (exif/iptc)
- require_once(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
- sync_metadata(array($image_id));
- }
+ $image_id = add_uploaded_file(
+ $file_path,
+ $params['original_filename'],
+ null, // categories
+ isset($params['level']) ? $params['level'] : null,
+ null, // image_id
+ $params['original_sum']
+ );
$info_columns = array(
'name',
'author',
'comment',
- 'level',
'date_creation',
);
+ $update = array();
+
foreach ($info_columns as $key)
{
if (isset($params[$key]))
@@ -2338,6 +2340,8 @@ function ws_tags_add($params, &$service)
function ws_images_exist($params, &$service)
{
+ ws_logfile(__FUNCTION__.' '.var_export($params, true));
+
global $conf;
if (!is_admin())
@@ -2416,6 +2420,8 @@ SELECT
function ws_images_checkFiles($params, &$service)
{
+ ws_logfile(__FUNCTION__.', input : '.var_export($params, true));
+
if (!is_admin())
{
return new PwgError(401, 'Access denied');
@@ -2441,36 +2447,47 @@ SELECT
WHERE id = '.$params['image_id'].'
;';
$result = pwg_query($query);
- if (pwg_db_num_rows($result) == 0) {
+ if (pwg_db_num_rows($result) == 0)
+ {
return new PwgError(404, "image_id not found");
}
list($path) = pwg_db_fetch_row($result);
$ret = array();
- foreach (array('thumb', 'file', 'high') as $type) {
- $param_name = $type;
- if ('thumb' == $type) {
- $param_name = 'thumbnail';
- }
+ if (isset($params['thumbnail_sum']))
+ {
+ // We always say the thumbnail is equal to create no reaction on the
+ // other side. Since Piwigo 2.4 and derivatives, the thumbnails and web
+ // sizes are always generated by Piwigo
+ $ret['thumbnail'] = 'equals';
+ }
- if (isset($params[$param_name.'_sum'])) {
- include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
- $type_path = file_path_for_type($path, $type);
- if (!is_file($type_path)) {
- $ret[$param_name] = 'missing';
- }
- else {
- if (md5_file($type_path) != $params[$param_name.'_sum']) {
- $ret[$param_name] = 'differs';
- }
- else {
- $ret[$param_name] = 'equals';
- }
- }
+ if (isset($params['high_sum']))
+ {
+ $ret['file'] = 'equals';
+ $compare_type = 'high';
+ }
+ elseif (isset($params['file_sum']))
+ {
+ $compare_type = 'file';
+ }
+
+ if (isset($compare_type))
+ {
+ ws_logfile(__FUNCTION__.', md5_file($path) = '.md5_file($path));
+ if (md5_file($path) != $params[$compare_type.'_sum'])
+ {
+ $ret[$compare_type] = 'differs';
+ }
+ else
+ {
+ $ret[$compare_type] = 'equals';
}
}
+ ws_logfile(__FUNCTION__.', output : '.var_export($ret, true));
+
return $ret;
}
diff --git a/ws.php b/ws.php
index d42b8f828..d0b21addd 100644
--- a/ws.php
+++ b/ws.php
@@ -259,7 +259,6 @@ function ws_addDefaultMethods( $arr )
'default' => 0,
'maxValue' => $conf['available_permission_levels']
),
- 'resize' => array('default' => false),
'check_uniqueness' => array('default' => true),
),
'POST method only.