TODO #21421

既存アイキャッチ画像と同じファイル名のアイキャッチ画像を別のコンテンツ等で登録すると既存アイキャッチ画像のサムネイル画像が上書きされてしまう

村上 彬6ヶ月前に追加. 5ヶ月前に更新.

ステータス:終了開始日:
優先度:通常期日:
担当者:村上 彬進捗率:

100%

カテゴリ:-
対象バージョン:4.1.1

説明

不具合について

baserCMS4.1.0.1で固定ページやフォルダ、ブログコンテンツで既存アイキャッチ画像と同じファイル名のアイキャッチ画像を別のコンテンツ等で登録すると既存アイキャッチ画像のサムネイル画像が上書きされてしまう事象を確認しました。
baseCMSコアのBcUploadビヘイビアの処理に問題があるようです。
アイキャッチ画像をアップロードした際に「/files」以下に画像を生成しますがその際、元画像名を元に一旦ファイルを生成しその後コンテンツID等を元にしたファイル名にリネームする流れとなります。
元画像のアップロードの際はファイル名重複回避の処理が実装されていることにより上書きを回避出来ておりましたがサムネイル画像に関してはこの処理が適用されておらず元画像ファイル名のまま一旦ファイルを生成してしまうことで既存画像のサムネイルを上書きされてしまうことが原因となります。
今回はバナープラグインで発生しているところを確認し調査することでコア側のバグであることが判明しました。
※ブログ記事のアイキャッチ画像登録では発生しません。

事象再現の流れ

1. コンテンツ1のアイキャッチ画像登録
1-1. 画像アップロード(test.jpg)
files/contents/test.jpg(元画像ファイル名を元にファイル生成)

1-2. リネーム
files/contents/0001.jpg

1-3. サムネイル生成
files/contents/thumb_test.jpg

1-4. サムネイルリネーム
files/contents/thumb_0001.jpg

2. コンテンツ2のアイキャッチ画像登録
2-1. 画像アップロード (0001.jpg)
files/contents/0001_1.jpg(重複するので'_1.jpg'でファイル生成)

2-2. リネーム
files/contents/0002.jpg

2-3. サムネイル生成
files/contents/thumb_0001.jpg (※ここで上書きされてしまう)

2-4. サムネイルリネーム (※リネームしてサムネイル生成不可)

改善方法

元画像がファイル名重複回避の処理によりリネームされている場合はサムネイル画像生成のメソッドに渡すデータも変更後のファイル名を渡すよう修正することで改善可能です。

/**
 * 画像をコピーする
 *
 * @param Model $Model
 * @param string $fileName
 * @param array $field
 * @return bool
 */
    public function copyImages(Model $Model, $field, $fileName) {
        if (!$this->tmpId && ($field['type'] == 'all' || $field['type'] == 'image') && !empty($field['imagecopy']) && in_array($field['ext'], $this->imgExts)) {
            foreach ($field['imagecopy'] as $copy) {
                // コピー画像が元画像より大きい場合はスキップして作成しない
                $size = $this->getImageSize($this->savePath[$Model->alias] . $fileName);
                if ($size && $size['width'] < $copy['width'] && $size['height'] < $copy['height']) {
                    if (isset($copy['smallskip']) && $copy['smallskip'] === false) {
                        $copy['width'] = $size['width'];
                        $copy['height'] = $size['height'];
                    } else {
                        continue;
                    }
                }
                /**
                 * >>> customize 2018/04/16
                 * ファイル名重複回避処理対応
                 */
                if ($fileName !== $Model->data[$Model->alias]['name']['name']) {
                    $Model->data[$Model->alias]['name']['name'] = $fileName;
                }
                /**
                 * <<< customize 2018/04/16
                 * ファイル名重複回避処理対応
                 */
                $copy['name'] = $field['name'];
                $copy['ext'] = $field['ext'];
                $ret = $this->copyImage($Model, $copy);
                if (!$ret) {
                    // 失敗したら処理を中断してfalseを返す
                    return false;
                }
            }
        }
        return true;
    }

}

以上、大変お手数ですがご確認のほど宜しくお願い致します。


関係しているリビジョン

リビジョン ee83f060
a-killer-bee が6ヶ月前に追加

fix #21421 既存アイキャッチ画像と同じファイル名のアイキャッチ画像を別のコンテンツ等で登録した際の不具合修正

リビジョン ce83da6f
江頭 竜二6ヶ月前に追加

fix #21421 既存アイキャッチ画像と同じファイル名のアイキャッチ画像を別のコンテンツ等で登録した際の不具合修正の調整

履歴

#1 村上 彬6ヶ月前に更新

  • 説明 を更新 (diff)

#2 村上 彬6ヶ月前に更新

  • 説明 を更新 (diff)

#3 村上 彬6ヶ月前に更新

  • 説明 を更新 (diff)

#4 村上 彬6ヶ月前に更新

  • 説明 を更新 (diff)

#5 村上 彬6ヶ月前に更新

  • 説明 を更新 (diff)

#6 匿名ユーザー が6ヶ月前に更新

  • ステータス担当 から 解決 に変更
  • 進捗率0 から 100 に変更

更新履歴 basercms|commit:ee83f060ec82a26a250185872f600eb70ed9102d で適用されました。

#7 江頭 竜二5ヶ月前に更新

  • 対象バージョン4.2.0 から 4.1.1 に変更

#8 江頭 竜二5ヶ月前に更新

  • ステータス解決 から 終了 に変更

他の形式にエクスポート: Atom PDF