Here's a perl upload implementation:
#!/usr/bin/perl use JSON; use LWP::UserAgent; use HTTP::Headers; use HTTP::Request; sub upload { my($key, $parent, $filetype, $fileLocation, $filename, $title, $description, $tags) = @_; my $entity = { name => $filename, type => $filetype }; my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($fileLocation); open(IMAGE,"<$fileLocation") || die "open: $!"; my $item; my $nread = sysread(IMAGE,$item,$size); close(IMAGE); my $boundary = "gallery3.upload.$$"; my $json = JSON->new; my $json_entity = $json->encode($entity); my(@parts); push(@parts,"--$boundary"); push(@parts,'Content-Disposition: form-data; name="entity"'); push(@parts,'Content-Type: text/plain; charset=UTF-8'); push(@parts,'Content-Transfer-Encoding: 8bit'); push(@parts,""); push(@parts,$json_entity); push(@parts,"--$boundary"); push(@parts,'Content-Disposition: form-data; name="file"; filename="'.$filename.'"'); # G3 rest server only wants application/octet-stream, won't accept real mime type push(@parts,'Content-Type: application/octet-stream'); # G3 rest server only wants binary, won't parse base64 push(@parts,'Content-Transfer-Encoding: binary'); push(@parts,''); push(@parts,$item); push(@parts,"--$boundary--"); my $data = join("\n",@parts); my $ua = LWP::UserAgent->new; my $headers = HTTP::Headers->new; $headers->header('X-Gallery-Request-Method' => 'post'); $headers->header('X-Gallery-Request-Key' => $key); $headers->header('Content-Type' => "multipart/form-data; boundary=$boundary"); $headers->header('Content-Length' => length $data); my $request= HTTP::Request->new('POST',$parent,$headers,$data); my $result = $ua->request($request); $result->content; }