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);
}
 

 
人間が手作業でやったらエラい面倒だよね。
ご参考までに。
 
 
 

§1244 · Posted By · 1月 10, 2014 · Development · Tags: , · [Print]