読者です 読者をやめる 読者になる 読者になる

パンプキンスパイスラテ

IT系のことが多めの日記帳です

MT::Assetからファイル名を条件に画像を読み出すとおかしな現象が・・・

perlソース部分の表示がおかしかったので修正しました(2008/12/12 09:40)


mt_assetテーブルにファイルアップローダーからアップして登録した下記のようなデータが入ってるとして、

mysql> select asset_id, asset_class, asset_file_name from mt_asset;
+----------+-------------+------------------+
| asset_id | asset_class | asset_file_name  |
+----------+-------------+------------------+
|        1 | image       | Water lilies.jpg |
+----------+-------------+------------------+

シンプルなこんなソースでファイル名で読み出す。

use MT::Asset;
my $image = MT::Asset->load({ file_name => "Water lilies.jpg" });

use Data::Dumper;
return Dumper($image);

結果。

$VAR1 = undef;

取れない・・・


コマンドプロンプトよりSQL文を直に発行してasset_classを「file」に変更。

update mt_asset set
asset_class = 'file'
where asset_id = 1;
+----------+-------------+------------------+
| asset_id | asset_class | asset_file_name  |
+----------+-------------+------------------+
|        1 | file        | Water lilies.jpg |
+----------+-------------+------------------+

んでもう一度。

use MT::Asset;
my $image = MT::Asset->load({ file_name => "Water lilies.jpg" });
  
use Data::Dumper;
return Dumper($image);

結果。

$VAR1 = bless( {
    '__triggers' => {},
    'column_values' => {
        'file_ext' => 'jpg',
        'file_path' => '%r\\images\\Water lilies.jpg',
        'parent' => undef,
        'description' => undef,
        'mime_type' => 'image/jpeg',
        'file_name' => 'Water lilies.jpg',
        'modified_on' => '20081211001119',
        'created_on' => '20081211001119',
        'modified_by' => undef,
        'url' => '%r/images/Water%20lilies.jpg',
        'blog_id' => '1',
        'id' => '1',
        'label' => 'Water lilies.jpg',
        'class' => 'file',
        'created_by' => '1'
          },
    '__meta' => bless( {
        '__pkeys' => {
          'asset_id' => '1'
        },
        'pkg' => 'MT::Asset'
          }, 'MT::Meta::Proxy' ),
    '__is_stored' => 1
           }, 'MT::Asset' );

取れたよ!!!


ちなみに「id」を条件にすると・・・

use MT::Asset;
my $image = MT::Asset->load({ id => 1 });
  
use Data::Dumper;
return Dumper($image);

結果。

$VAR1 = bless( {
    '__triggers' => {},
    'column_values' => {
        'file_ext' => 'jpg',
        'file_path' => '%r\\images\\Water lilies.jpg',
        'parent' => undef,
        'description' => undef,
        'mime_type' => 'image/jpeg',
        'file_name' => 'Water lilies.jpg',
        'modified_on' => '20081211001119',
        'created_on' => '20081211001119',
        'modified_by' => undef,
        'url' => '%r/images/Water%20lilies.jpg',
        'blog_id' => '1',
        'id' => '1',
        'label' => 'Water lilies.jpg',
        'class' => 'file',
        'created_by' => '1'
          },
    '__meta' => bless( {
        '__pkeys' => {
          'asset_id' => '1'
        },
        'pkg' => 'MT::Asset'
          }, 'MT::Meta::Proxy' ),
    '__is_stored' => 1
           }, 'MT::Asset' );

取れたよ!!!

結論

なんでか知らんが、ファイル名などstringの値を条件に「load」する時は、asset_classの値が「file」じゃないとうまく取得できない><
なんでだぁぁぁ!!

追記

コメントで教えていただきました。

use MT::Asset;
my $image = MT::Asset::Image->load({ file_name => "Water lilies.jpg" });
use MT::Asset;
my $image = MT::Asset->load({ file_name => "Water lilies.jpg", class => 'image' });

上記の方法で取得できました!

さらに追記

コメントより。

my $filename = "Water lilies.jpg";
my $asset_pkg = MT::Asset->handler_for_file( $filename );
my $data = $asset_pkg->load({ file_name => $filename });

2行目で指定したファイル名のデータの「MT::Asset::*」のPackageを取得し、3行目でそれを使ってload。
これならどんなファイルタイプでも取得できます!