🌍
English
Add a photo.
Similar to pwg.images.addChunk + pwg.images.add, but simpler and better suited for Piwigo 2.7+
This method requires authentication with an administrator user.
This method requires an HTTP POST request.
This method also requires a pwg_token (session valid key).
Important note: we are uploading a file, so the HTTP request encoding must be set to “form-data”.
Key | Example | Mandatory? | Description |
---|---|---|---|
image | /path/to/file.jpg | mandatory | the uploaded file. JPG or PNG files only. |
category | 123 | mandatory | the identifier of the destination category, use pwg.categories.getList to find existing categories |
pwg_token | verylongstring | mandatory | this is a session key, once identified you can get it with method pwg.session.getStatus |
chunks | 12 | optional | number of expected chunks |
chunk | 0 | optional | current chunk number, from 0 to chunks-1 |
name | A nice title | optional | the title of your photo, don't make it too long (use the comment to go into details |
name | A nice title | optional | the title of your photo, don't make it too long (use the comment to go into details |
level | 2 | optional | (default = 0) privacy setting. See an example in your Piwigo on screen Administration > Photos > Add. 0 is for everybody, 8 is for admins only |
Here comes a full example in Perl language (see the most updated version on piwigo_upload.pl on source code repository):
#!/usr/bin/perl #### # Usage # # perl piwigo_upload.pl --url=http://piwigo.org/demo --user=admin --password=secret --file=photo.jpg --album_id=9 use strict; use warnings; use JSON; use LWP::UserAgent; use Getopt::Long; use POSIX qw(ceil floor); use Digest::MD5 qw/md5 md5_hex/; use File::Slurp; use File::Basename; my %opt = (); GetOptions( \%opt, qw/ file=s album_id=i category=s url=s username=s password=s / ); our %conf = ( chunk_size => 500_000, ); our $ua = LWP::UserAgent->new; $ua->agent('Mozilla/piwigo_upload.pl 1.56'); $ua->cookie_jar({}); my $result = undef; my $form = { method => 'pwg.session.login', username => $opt{username}, password => $opt{password}, }; $result = $ua->post( $opt{url}.'/ws.php?format=json', $form ); my $response = $ua->post( $opt{url}.'/ws.php?format=json', { method => 'pwg.session.getStatus', } ); my $pwg_token = from_json($response->content)->{result}->{pwg_token}; my $content = read_file($opt{file}); my $content_length = length($content); my $nb_chunks = ceil($content_length / $conf{chunk_size}); my $chunk_pos = 0; my $chunk_id = 0; while ($chunk_pos < $content_length) { my $chunk = substr( $content, $chunk_pos, $conf{chunk_size} ); # write the chunk as a temporary local file my $chunk_path = '/tmp/'.md5_hex($opt{file}).'.chunk'; open(my $ofh, '>'.$chunk_path) or die "problem for writing temporary local chunk"; print {$ofh} $chunk; close($ofh); $chunk_pos += $conf{chunk_size}; my $response = $ua->post( $opt{url}.'/ws.php?format=json', { method => 'pwg.images.upload', chunk => $chunk_id, chunks => $nb_chunks, category => $opt{album_id}, pwg_token => $pwg_token, file => [$chunk_path], name => basename($opt{file}), }, 'Content_Type' => 'form-data', ); unlink($chunk_path); printf( 'chunk %03u of %03u for "%s"'."\n", $chunk_id+1, $nb_chunks, $opt{file} ); if ($response->code != 200) { printf("response code : %u\n", $response->code); printf("response message : %s\n", $response->message); } $chunk_id++; } $result = $ua->get( $opt{url}.'/ws.php?format=json', { method => 'pwg.session.logout' } );