aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorplegall <plg@piwigo.org>2011-02-11 22:57:23 +0000
committerplegall <plg@piwigo.org>2011-02-11 22:57:23 +0000
commite79538be5ce50fe552c0180c169cfb275aa4ec07 (patch)
tree6640d1748fb5450e21211a94c8904217ee2103e1
parentcc88f221110378648abd70f6141e2db07933ebfc (diff)
feature 2189 added: ability to update a photo (the JPEG/PNG file) with
pwg.images.addSimple, simply by adding an $image_id as argument. git-svn-id: http://piwigo.org/svn/trunk@9191 68402e56-0260-453c-a942-63ccdbb3a9ee
-rw-r--r--admin/include/functions.php112
-rw-r--r--admin/include/functions_upload.inc.php173
-rw-r--r--include/ws_functions.inc.php47
-rw-r--r--ws.php3
4 files changed, 228 insertions, 107 deletions
diff --git a/admin/include/functions.php b/admin/include/functions.php
index f736902b0..1e1f1b454 100644
--- a/admin/include/functions.php
+++ b/admin/include/functions.php
@@ -166,26 +166,20 @@ DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
trigger_action('delete_categories', $ids);
}
-// The function delete_elements deletes the elements identified by the
-// (numeric) values of the array $ids. It also deletes (in the database) :
-// - all the comments related to elements
-// - all the links between categories and elements
-// - all the favorites associated to elements
-// @return number of deleted elements
-function delete_elements($ids, $physical_deletion=false)
+// Deletes all files (on disk) related to given image ids
+// @return image ids where files are deleted successfully
+function delete_element_files($ids)
{
if (count($ids) == 0)
{
return 0;
}
- trigger_action('begin_delete_elements', $ids);
- if ($physical_deletion)
- {
- include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
- $new_ids=array();
+ include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+
+ $new_ids = array();
- $query = '
+ $query = '
SELECT
id,
path,
@@ -195,40 +189,74 @@ SELECT
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $ids).')
;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
+ $result = pwg_query($query);
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (url_is_remote($row['path']))
{
- if (url_is_remote($row['path']))
- continue;
- $files = array();
- $files[] = get_element_path($row);
- if (!empty($row['tn_ext']))
- $files[] = get_thumbnail_path($row);
- if (!empty($row['has_high']) and get_boolean($row['has_high']))
- $files[] = get_high_path($row);
- if (!empty($row['representative_ext']))
- {
- $pi = pathinfo($row['path']);
- $file_wo_ext = get_filename_wo_extension($pi['basename']);
- $files[] = PHPWG_ROOT_PATH.$pi['dirname'].'/pwg_representative/'.$file_wo_ext.'.'.$element_info['representative_ext'];
- }
+ continue;
+ }
+
+ $files = array();
+ $files[] = get_element_path($row);
+
+ if (!empty($row['tn_ext']))
+ {
+ $files[] = get_thumbnail_path($row);
+ }
+
+ if (!empty($row['has_high']) and get_boolean($row['has_high']))
+ {
+ $files[] = get_high_path($row);
+ }
+
+ if (!empty($row['representative_ext']))
+ {
+ $pi = pathinfo($row['path']);
+ $file_wo_ext = get_filename_wo_extension($pi['basename']);
+ $files[] = PHPWG_ROOT_PATH.$pi['dirname'].'/pwg_representative/'.$file_wo_ext.'.'.$row['representative_ext'];
+ }
- $ok = true;
- foreach ($files as $path)
+ $ok = true;
+ foreach ($files as $path)
+ {
+ if (is_file($path) and !unlink($path))
{
- if (is_file($path) and !unlink($path))
- {
- $ok = false;
- trigger_error('"'.$path.'" cannot be removed', E_USER_WARNING);
- break;
- }
- }
- if ($ok)
- $new_ids[] += $row['id'];
- else
+ $ok = false;
+ trigger_error('"'.$path.'" cannot be removed', E_USER_WARNING);
break;
+ }
+ }
+
+ if ($ok)
+ {
+ $new_ids[] += $row['id'];
+ }
+ else
+ {
+ break;
}
- $ids = $new_ids;
+ }
+ return $new_ids;
+}
+
+// The function delete_elements deletes the elements identified by the
+// (numeric) values of the array $ids. It also deletes (in the database) :
+// - all the comments related to elements
+// - all the links between categories and elements
+// - all the favorites associated to elements
+// @return number of deleted elements
+function delete_elements($ids, $physical_deletion=false)
+{
+ if (count($ids) == 0)
+ {
+ return 0;
+ }
+ trigger_action('begin_delete_elements', $ids);
+
+ if ($physical_deletion)
+ {
+ $ids = delete_element_files($ids);
if (count($ids)==0)
{
return 0;
diff --git a/admin/include/functions_upload.inc.php b/admin/include/functions_upload.inc.php
index c31047239..a0bcf34fe 100644
--- a/admin/include/functions_upload.inc.php
+++ b/admin/include/functions_upload.inc.php
@@ -168,7 +168,7 @@ function prepare_upload_configuration()
}
}
-function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null)
+function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null, $image_id=null)
{
// Here is the plan
//
@@ -185,37 +185,68 @@ function add_uploaded_file($source_filepath, $original_filename=null, $categorie
// * check md5sum (already exists?)
global $conf, $user;
-
- // 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
$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.'.';
+ $file_path = null;
+
+ if (isset($image_id))
+ {
+ // we are performing an update
+ $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');
+ }
- list($width, $height, $type) = getimagesize($source_filepath);
- if (IMAGETYPE_PNG == $type)
- {
- $file_path.= 'png';
+ // delete all physical files related to the photo (thumbnail, web site, HD)
+ delete_element_files(array($image_id));
}
else
{
- $file_path.= 'jpg';
+ // 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';
+ }
+ else
+ {
+ $file_path.= 'jpg';
+ }
+
+ prepare_directory($upload_dir);
}
- prepare_directory($upload_dir);
if (is_uploaded_file($source_filepath))
{
move_uploaded_file($source_filepath, $file_path);
@@ -296,37 +327,77 @@ function add_uploaded_file($source_filepath, $original_filename=null, $categorie
$thumb_infos = pwg_image_infos($thumb_path);
- // database registration
- $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'],
- 'height' => $file_infos['height'],
- 'md5sum' => $md5sum,
- 'added_by' => $user['id'],
- );
-
- if (isset($high_infos))
+ if (isset($image_id))
{
- $insert['has_high'] = 'true';
- $insert['high_filesize'] = $high_infos['filesize'];
- }
+ $update = array(
+ 'id' => $image_id,
+ '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'],
+ );
+
+ if (isset($high_infos))
+ {
+ $update['has_high'] = 'true';
+ $update['high_filesize'] = $high_infos['filesize'];
+ }
+ else
+ {
+ $update['has_high'] = 'false';
+ $update['high_filesize'] = null;
+ }
- if (isset($level))
- {
- $insert['level'] = $level;
+ if (isset($level))
+ {
+ $update['level'] = $level;
+ }
+
+ mass_updates(
+ IMAGES_TABLE,
+ array(
+ 'primary' => array('id'),
+ 'update' => array_keys($update)
+ ),
+ array($update)
+ );
}
+ else
+ {
+ // database registration
+ $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'],
+ 'height' => $file_infos['height'],
+ 'md5sum' => $md5sum,
+ 'added_by' => $user['id'],
+ );
+
+ 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)
- );
+ mass_inserts(
+ IMAGES_TABLE,
+ array_keys($insert),
+ array($insert)
+ );
- $image_id = pwg_db_insert_id(IMAGES_TABLE);
+ $image_id = pwg_db_insert_id(IMAGES_TABLE);
+ }
if (isset($categories) and count($categories) > 0)
{
@@ -342,7 +413,7 @@ function add_uploaded_file($source_filepath, $original_filename=null, $categorie
$conf['use_exif'] = false;
}
update_metadata(array($image_id=>$file_path));
-
+
invalidate_user_cache();
return $image_id;
diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php
index d0b550a2a..be453b6f7 100644
--- a/include/ws_functions.inc.php
+++ b/include/ws_functions.inc.php
@@ -1352,10 +1352,28 @@ function ws_images_addSimple($params, &$service)
{
return new PwgError(405, "This method requires HTTP POST");
}
+
+ $params['image_id'] = (int)$params['image_id'];
+ if ($params['image_id'] > 0)
+ {
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $query='
+SELECT *
+ FROM '.IMAGES_TABLE.'
+ WHERE id = '.$params['image_id'].'
+;';
+
+ $image_row = pwg_db_fetch_assoc(pwg_query($query));
+ if ($image_row == null)
+ {
+ return new PwgError(404, "image_id not found");
+ }
+ }
// category
$params['category'] = (int)$params['category'];
- if ($params['category'] <= 0)
+ if ($params['category'] <= 0 and $params['image_id'] <= 0)
{
return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
}
@@ -1366,8 +1384,9 @@ function ws_images_addSimple($params, &$service)
$image_id = add_uploaded_file(
$_FILES['image']['tmp_name'],
$_FILES['image']['name'],
- array($params['category']),
- 8
+ $params['category'] > 0 ? array($params['category']) : null,
+ 8,
+ $params['image_id'] > 0 ? $params['image_id'] : null
);
$info_columns = array(
@@ -1415,23 +1434,25 @@ function ws_images_addSimple($params, &$service)
add_tags($tag_ids, array($image_id));
}
- $query = '
+ $url_params = array('image_id' => $image_id);
+
+ if ($params['category'] > 0)
+ {
+ $query = '
SELECT id, name, permalink
FROM '.CATEGORIES_TABLE.'
WHERE id = '.$params['category'].'
;';
- $result = pwg_query($query);
- $category = pwg_db_fetch_assoc($result);
+ $result = pwg_query($query);
+ $category = pwg_db_fetch_assoc($result);
+
+ $url_params['section'] = 'categories';
+ $url_params['category'] = $category;
+ }
return array(
'image_id' => $image_id,
- 'url' => make_picture_url(
- array(
- 'image_id' => $image_id,
- 'section' => 'categories',
- 'category' => $category
- )
- ),
+ 'url' => make_picture_url($url_params),
);
}
diff --git a/ws.php b/ws.php
index 82a4823d8..c2d2115d7 100644
--- a/ws.php
+++ b/ws.php
@@ -233,8 +233,9 @@ function ws_addDefaultMethods( $arr )
'maxValue' => $conf['available_permission_levels']
),
'tags' => array('default' => null),
+ 'image_id' => array('default' => null),
),
- 'POST method only.<br>Use the <b>image</b> field for uploading file.<br>Set the form encoding to "form-data"<br><b>category</b> is the numeric identifier of the destination category.'
+ 'POST method only.<br>Use the <b>image</b> field for uploading file.<br>Set the form encoding to "form-data"<br><b>category</b> is the numeric identifier of the destination category.<br>You can update an existing photo if you define an existing image_id.'
);
$service->addMethod(