aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorplegall <plg@piwigo.org>2009-11-22 23:38:57 +0000
committerplegall <plg@piwigo.org>2009-11-22 23:38:57 +0000
commitd7f0f0f9b2146ed18df7a83f5d529f5afc9e4aad (patch)
tree4a2d5987ce543d678b1e2598c6cb0255d47055db
parent6768482bcf5ba73a1fd429a1584134c2b213044d (diff)
feature 1051: ability to add/update a file for an existing photo. For example,
you can add the "high" later. Another example is to update the "web resized" file (new dimensions is a common example). It also works for thumbnails. Updating an existing file has no impact on the logical level (list of tags, list of categories, title, description and so on). git-svn-id: http://piwigo.org/svn/branches/2.0@4345 68402e56-0260-453c-a942-63ccdbb3a9ee
-rw-r--r--include/ws_functions.inc.php84
-rw-r--r--tools/piwigo_remote.pl80
-rw-r--r--ws.php13
3 files changed, 174 insertions, 3 deletions
diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php
index a01322547..323c6c689 100644
--- a/include/ws_functions.inc.php
+++ b/include/ws_functions.inc.php
@@ -942,6 +942,17 @@ function merge_chunks($output_filepath, $original_sum, $type)
{
ws_logfile('[merge_chunks] input parameter $output_filepath : '.$output_filepath);
+ if (is_file($output_filepath))
+ {
+ unlink($output_filepath);
+
+ if (is_file($output_filepath))
+ {
+ new PwgError(500, '[merge_chunks] error while trying to remove existing '.$output_filepath);
+ exit();
+ }
+ }
+
$upload_dir = PHPWG_ROOT_PATH.'upload/buffer';
$pattern = '/'.$original_sum.'-'.$type.'/';
$chunks = array();
@@ -1038,6 +1049,79 @@ function add_file($file_path, $type, $original_sum, $file_sum)
);
}
+function ws_images_addFile($params, &$service)
+{
+ // image_id
+ // type {thumb, file, high}
+ // sum
+
+ global $conf;
+ if (!is_admin() || is_adviser() )
+ {
+ return new PwgError(401, 'Access denied');
+ }
+
+ $params['image_id'] = (int)$params['image_id'];
+ if ($params['image_id'] <= 0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+ }
+
+ //
+ // what is the path?
+ //
+ $query = '
+SELECT
+ path,
+ md5sum
+ FROM '.IMAGES_TABLE.'
+ WHERE id = '.$params['image_id'].'
+;';
+ list($file_path, $original_sum) = mysql_fetch_row(pwg_query($query));
+
+ // TODO only files added with web API can be updated with web API
+
+ //
+ // makes sure directories are there and call the merge_chunks
+ //
+ $infos = add_file($file_path, $params['type'], $original_sum, $params['sum']);
+
+ //
+ // update basic metadata from file
+ //
+ $update = array();
+
+ if ('high' == $params['type'])
+ {
+ $update['high_filesize'] = $infos['filesize'];
+ $update['has_high'] = 'true';
+ }
+
+ if ('file' == $params['type'])
+ {
+ $update['filesize'] = $infos['filesize'];
+ $update['width'] = $infos['width'];
+ $update['height'] = $infos['height'];
+ }
+
+ // we may have nothing to update at database level, for example with a
+ // thumbnail update
+ if (count($update) > 0)
+ {
+ $update['id'] = $params['image_id'];
+
+ 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)
+ );
+ }
+}
+
function ws_images_add($params, &$service)
{
global $conf;
diff --git a/tools/piwigo_remote.pl b/tools/piwigo_remote.pl
index 91b072aeb..8c8098daf 100644
--- a/tools/piwigo_remote.pl
+++ b/tools/piwigo_remote.pl
@@ -83,11 +83,10 @@ $result = $ua->post(
# print "\n", $ua->cookie_jar->as_string, "\n";
if ($opt{action} eq 'pwg.images.add') {
- use MIME::Base64 qw(encode_base64);
use Digest::MD5::File qw/file_md5_hex/;
$form = {};
- $form->{method} = 'pwg.images.add';
+ $form->{method} = $opt{action};
my $original_sum = file_md5_hex($opt{original});
$form->{original_sum} = $original_sum;
@@ -145,6 +144,70 @@ if ($opt{action} eq 'pwg.images.add') {
}
}
+if ($opt{action} eq 'pwg.images.addFile') {
+ use Digest::MD5::File qw/file_md5_hex/;
+
+ if (not defined $opt{define}{image_id}) {
+ die '--define image_id=1234 is missing';
+ }
+
+ # which file type are we going to add/update?
+ my $type = undef;
+
+ foreach my $test_type (qw/thumbnail file high/) {
+ if (defined $opt{$test_type}) {
+ $type = $test_type;
+ last;
+ }
+ }
+
+ if (not defined $type) {
+ die 'at least one of file/thumbnail/high parameters must be set';
+ }
+
+ my $type_code = typecode_from_typename($type);
+
+ send_chunks(
+ filepath => $opt{$type},
+ type => $type_code,
+ original_sum => file_md5_hex($opt{original}),
+ );
+
+ $form = {};
+ $form->{method} = $opt{action};
+ $form->{type} = $type_code;
+ $form->{sum} = file_md5_hex($opt{$type});
+
+ foreach my $key (keys %{ $opt{define} }) {
+ $form->{$key} = $opt{define}{$key};
+ }
+
+ my $response = $ua->post(
+ $conf{base_url}.'/ws.php?format=json',
+ $form
+ );
+
+ print "-" x 50, "\n";
+ printf("response code : %u\n", $response->code);
+ printf("response message : %s\n", $response->message);
+ print "-" x 50, "\n";
+ print "\n";
+
+# use Data::Dumper;
+# print Dumper($response->content);
+# print Dumper(from_json($response->content));
+
+ if ($response->is_success) {
+ print "upload successful\n";
+ }
+ else {
+ print Dumper($response);
+ warn 'A problem has occured during upload', "\n";
+ warn $response->decoded_content, "\n";
+ die $response->status_line;
+ }
+}
+
if ($opt{action} eq 'pwg.tags.list') {
use Text::ASCIITable;
@@ -333,6 +396,7 @@ sub pwg_ws_get_query {
sub send_chunks {
my %params = @_;
+ use MIME::Base64 qw(encode_base64);
use File::Slurp;
my $content = read_file($params{filepath});
@@ -375,3 +439,15 @@ sub send_chunks {
$chunk_id++;
}
}
+
+sub typecode_from_typename {
+ my ($typename) = @_;
+
+ my $typecode = $typename;
+
+ if ('thumbnail' eq $typename) {
+ $typecode = 'thumb';
+ }
+
+ return $typecode;
+}
diff --git a/ws.php b/ws.php
index 66bab7577..2e2b8f6f9 100644
--- a/ws.php
+++ b/ws.php
@@ -183,7 +183,18 @@ function ws_addDefaultMethods( $arr )
),
'POST method only. For admin only.'
);
-
+
+ $service->addMethod(
+ 'pwg.images.addFile',
+ 'ws_images_addFile',
+ array(
+ 'image_id' => array(),
+ 'type' => array(),
+ 'sum' => array(),
+ ),
+ 'Add or update a file for an existing photo. pwg.images.addChunk must have been called before (maybe several times)'
+ );
+
$service->addMethod(
'pwg.images.add',