S3に写真を一括アップロード

| 0 Comments | 0 TrackBacks | このエントリーをはてなブックマークに追加 このエントリーのはてなブックマーク件数

Livedoor picsだと容量を気にする必要があるので、AmazonのS3にバックアップするスクリプトを書いてみました。これで、いざFlickrのデータが飛んでも大丈夫ですね。

#!/usr/bin/env perl
use strict;
use warnings;
use Net::Amazon::S3;
use Perl6::Say;
use Path::Class qw(dir);
use List::MoreUtils qw(any);

# config
my $bucketname            = 'Your backect name for backup';
my $aws_access_key_id     = 'Your access id';
my $aws_secret_access_key = 'Your secret access key';

my $s3 = Net::Amazon::S3->new(
    {   aws_access_key_id     => $aws_access_key_id,
        aws_secret_access_key => $aws_secret_access_key,
        retry                 => 1,
    }
);
my $bucket_for_backup = create_backet_for_backup();

main();
sub main {
    my $dir = dir('photos');
    upload_photos_in_dir($dir);
    list_files_in_bucket($bucket_for_backup);
}

sub create_backet_for_backup {
    my $bucket = $s3->add_bucket( { bucket => $bucketname } )
        or die $s3->err . ": " . $s3->errstr;
    return $bucket;
}

sub upload_photos_in_dir {
    my $dir = shift;
    dir($dir)->recurse(
        callback => sub {
            my $file = shift;
            return unless -f $file;
            upload_file($file);
        }
    );
}

sub upload_file {
    my $file = shift;
    return unless ( $file->basename =‾ /¥.jpg$/ );
    my $keys_in_bucket = keys_in_bucket($bucket_for_backup);
    return if any { $file->basename eq $_->{key} } @{$keys_in_bucket};

    my $body   = $file->slurp;
    my $status = $bucket_for_backup->add_key( $file->basename, $body,
        { 'content_type' => 'image/jpeg', } );
    say "Uploaded:" . $file->basename if $status;
}

my $cache_keys;

sub keys_in_bucket {
    my $bucket = shift;
    return $cache_keys if $cache_keys;
    my $response = $bucket_for_backup->list_all
        or die $s3->err . ": " . $s3->errstr;
    $cache_keys = $response->{keys};
    $cache_keys;
}

sub list_files_in_bucket {
    my $bucket = shift;
    say '### list all files in bucket';
    my $response = $bucket->list_all
        or die $s3->err . ": " . $s3->errstr;
    foreach my $key ( @{ $response->{keys} } ) {
        my $key_name = $key->{key};
        my $key_size = $key->{size};
        say "Bucket contains key '$key_name' of size $key_size";
    }
}|

Flickrから一括ダウンロードして、Amazon S3に一括バックアップというのをするのもいいかもしれないですね。


# photosディレクトリ決めうちなので適当に変えてください。写真のあるディレクトリの場所が変わるようであれば、Getoptで写真のあるディレクトリを指定できるように変更するのがいいですね。

No TrackBacks

TrackBack URL: http://perl-mongers.org/MT/mt-tb.cgi/63

Leave a comment

About this Entry

This page contains a single entry by http://coderepos.org/share/wiki/Committers/dann published on June 22, 2008 3:09 AM.

Livedoor picsに写真を一括アップロード was the previous entry in this blog.

codereposのコミット数ランキングページを作る is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

Creative Commons License
This blog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en