
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);
}
人間が手作業でやったらエラい面倒だよね。
ご参考までに。
