Yahoo!ショッピングのストアマネージャーやその他のモール管理システムで商品の画像をアップするときに、一度にUPできるファイルの容量に制限が設けられていることがある(ECだけじゃないよね。こういうことって意外とよくある)。
例えばYahoo!ショッピングの場合は一回のUPがマックス25MB。
Savaway製のPowerDoだと20MB。
やり方はいろいろあるだろうけど、うちでは以下の様な Perl スクリプトで処理してる。
photos_into_folder_by_MB.pl
#! /usr/bin/perl use warnings; use strict; use Getopt::Long; # 使い方 # photos_into_folder_by_MB.pl -f 画像が入ってるdir -t 分割した画像フォルダを作成したいdir my $from_dir = ""; my $to_dir = ""; GetOptions( 'from_dir|f=s' => \$from_dir, 'to_dir|t=s' => \$to_dir, ); # 少なくとも -f が指定されてなかったら die die unless $from_dir; # -t が指定されてなかったら -f で指定された # フォルダの中に分割フォルダを作る unless ($to_dir) { $to_dir = $from_dir; } # 新規作成するフォルダの番号=名前 my $dir_num = 0; # フォルダ単位の総バイト数 my $byte_sum = 0; # リミットのバイト数(定数) # 実はリミットを1ファイル分超えたところで書きだすので # この例だと 20MB のフォルダを作るのに 19MB で切ってる my $limit_byte = 19000000; # コピー対象の画像名を格納しておく配列変数 my @cp_photos = (); # 実際の処理をするサブルーチン sub make_photo_dir { # 画像名が入ってる配列のリファレンスを受け取る my $cp_photos_ref = shift; # グローバルに定義した $dir_num をグロスで増やす $dir_num++; # フォルダを作って mkdir "$to_dir" unless -d $to_dir; mkdir "$to_dir/$dir_num" unless -d "$to_dir/$dir_num"; # 作ったフォルダに画像をコピー # お好みで mv でもいいと思う foreach my $cp_photo (@$cp_photos_ref) { system "cp \"$cp_photo\" \"$to_dir/$dir_num/\""; # ますはここを # print "cp \"$cp_photo\" \"$to_dir/$dir_num/\"\n"; # のようにしてテストしてみてね } # グローバル変数初期化 $byte_sum = 0; @cp_photos = (); } # -f フォルダの中を glob my @photos = glob "$from_dir/*"; # メインループ foreach my $photo (@photos) { # ディレクトリはスキップ next if -d $photo; # ファイルサイズを各変数に格納 my $byte = -s $photo; $byte_sum += $byte; push @cp_photos, $photo; # リミットを超えちゃったタイミング if ($byte_sum > $limit_byte) { make_photo_dir(\@cp_photos); } } # 最後に残った $limit_byte 以下の分を処理 if (@cp_photos) { make_photo_dir(\@cp_photos); }
人間が手作業でやったらエラい面倒だよね。
ご参考までに。