TODO #21421

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

Added by 村上 彬 about 1 year ago. Updated about 1 year ago.

Status:終了Start date:
Priority:通常Due date:
Assignee:村上 彬% Done:

100%

Category:-
Target version:4.1.1

Description

不具合について

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

}

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


Associated revisions

Revision ee83f060
Added by a-killer-bee about 1 year ago

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

Revision ce83da6f
Added by 江頭 竜二 about 1 year ago

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

History

#1 Updated by 村上 彬 about 1 year ago

  • Description updated (diff)

#2 Updated by 村上 彬 about 1 year ago

  • Description updated (diff)

#3 Updated by 村上 彬 about 1 year ago

  • Description updated (diff)

#4 Updated by 村上 彬 about 1 year ago

  • Description updated (diff)

#5 Updated by 村上 彬 about 1 year ago

  • Description updated (diff)

#6 Updated by Anonymous about 1 year ago

  • Status changed from 担当 to 解決
  • % Done changed from 0 to 100

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

#7 Updated by 江頭 竜二 about 1 year ago

  • Target version changed from 4.2.0 to 4.1.1

#8 Updated by 江頭 竜二 about 1 year ago

  • Status changed from 解決 to 終了

Also available in: Atom PDF