先日、仕事でEC-CUBE (Version 2.12.2(zip)) をインストールした際に、1点嵌ってしまったので。

サーバーはロリポップだったのですが、インストールに関しては、公式でもマニュアルがありますし、検索してもらえればいくらでも方法が出てくると思うので割愛します。

そこで、無事インストールを終えたと思ったら、サムネイルが表示されていないことに気づいてしまいました。

実際には、「ページを読み込んでいる間は表示されているのに、読み込み終わると同時に画像が消えてしまう(リンク切れと同じ表示)」という謎の状態。

色々調べてみた所。

  • gdライブラリが必要→ロリポップ!は対応済み
  • define.phpの文字コードが違う→UTF-8からSJISに変えても変化なし
  • resize_image.phpが原因らしいので書き換える→知識不足で不可
  • モジュールのresize_image.phpを読み込んでいる部分を書き換え→100箇所程あるようで却下(時間がない)

と、いろいろ解決しました記事が見つかるのですが、効果がなかったり、実現が難しかったりで困ってましたが。

こちらの記事に、
http://web-karakuri.com/archives/3232

“原因は、httpヘッダーに、いらないものをはいてしまう場合です。”

とあったので、これをヒントに以下のファイルを修正したら、とりあえずはサムネイルが表示されるようになりました。

実際のソース

/data/module/gdthumb.php
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

<?php
/*

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
GD自動サムネイル作成 + 中川修正2006/02/03

Copyright 2002- Akihiro Asai. All rights reserved.

http://aki.adam.ne.jp
aki@mx3.adam.ne.jp

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

□ 機能概要
・指定されたイメージのサムネイルを表示します。
・出力する大きさを指定する事ができます。
・出力されるイメージのアスペクト比は維持されます。

□ 使用方法
指定は gdthumb.php?path=xxx/xxx.[ jpg | png | gif ]&mw=xx&mh=xx
※ passの部分には画像へのパスを指定
※ mwに表示画像の最大横幅、mhに表示画像の最大横幅を外部より指定可能。
※ 指定しなかった場合はデフォルトの設定値を採用。
★クラスとして使用する場合は、「クラスとして使用する場合には・・・」以降をコメントアウトして下さい。

□ 更新履歴
2002/08/19 最大縦幅の部分を一部手直し
2003/01/31 デフォルトでアスペクト比が固定
2003/04/11 最大横幅と最大縦幅を外部より指定可能
2003/04/25 GD2用に関数変更
2003/06/21 GD1/2をバージョンに応じて変更できるように修正
2003/06/25 imageCopyResampledの部分を修正
2004/01/28 スクリプト全体を書き直し。引数「pass」を「path」に変更。
2005/12/08 関数の自動判別 gif形式に対応 透過gif・透過pngに対応(GD2.0.1以降)
*/

// クラスとして使用する場合には、以下の6行をコメントアウト
/*
$objg = new gdthumb();
list($Ck, $Msg) = $objg->Main($_GET["path"], $_GET["mw"], $_GET["mh"]);
if(!$Ck) { // エラーの場合
     header("Content-Type: text/html; charset=" . CHAR_CODE);
     print $Msg;
}
*/

class gdthumb {

     var $imgMaxWidth;
     var $imgMaxHeight;
     var $gdVer;

     /*
     * コンストラクタ
     */
     function gdthumb() {

          // スクリプトのデフォルト設定

          // 画像の最大横幅
          $this->imgMaxWidth = 240; // 1以上の値

          // 画像の最大縦幅
          $this->imgMaxHeight = 0; // 指定しない場合は0 指定する場合は1以上の値

     }

     /*
     * サムネイル画像の作成
     * string $path
     * integer $width
     * integer $height
     */
     function Main($path, $width, $height, $dst_file, $header = false) {

          if(!isset($path)) {
               return array(0, "イメージのパスが設定されていません。");
          }

          if(!file_exists($path)) {
               return array(0, "指定されたパスにファイルが見つかりません。");
          }

          // 画像の大きさをセット
          if($width) $this->imgMaxWidth = $width;
          if($height) $this->imgMaxHeight = $height;

          $size = @GetimageSize($path);
          $re_size = $size;

          //アスペクト比固定処理
          if($this->imgMaxWidth != 0) {
               $tmp_w = $size[0] / $this->imgMaxWidth;
          }

          if($this->imgMaxHeight != 0) {
               $tmp_h = $size[1] / $this->imgMaxHeight;
          }

          if($tmp_w > 1 || $tmp_h > 1) {
               if($this->imgMaxHeight == 0) {
                    if($tmp_w > 1) {
                         $re_size[0] = $this->imgMaxWidth;
                         $re_size[1] = $size[1] * $this->imgMaxWidth / $size[0];
                    }
               } else {
                    if($tmp_w > $tmp_h) {
                         $re_size[0] = $this->imgMaxWidth;
                         $re_size[1] = $size[1] * $this->imgMaxWidth / $size[0];
                    } else {
                         $re_size[1] = $this->imgMaxHeight;
                         $re_size[0] = $size[0] * $this->imgMaxHeight / $size[1];
                    }
               }
          }

          $imagecreate = function_exists("imagecreatetruecolor") ? "imagecreatetruecolor" : "imagecreate";
          $imageresize = function_exists("imagecopyresampled") ? "imagecopyresampled" : "imagecopyresized";

          switch($size[2]) {

               // gif形式
               case "1":
                    if(function_exists("imagecreatefromgif")) {
                         $src_im = imagecreatefromgif($path);
                         $dst_im = $imagecreate($re_size[0], $re_size[1]);

                         $transparent = imagecolortransparent($src_im);
                         $colorstotal = imagecolorstotal ($src_im);

                         $dst_im = imagecreate($re_size[0], $re_size[1]);
                         if (0 <= $transparent && $transparent < $colorstotal) {
                              imagepalettecopy ($dst_im, $src_im);
                              imagefill ($dst_im, 0, 0, $transparent);
                              imagecolortransparent ($dst_im, $transparent);
                         }
                         $imageresize($dst_im, $src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]);

                         if(function_exists("imagegif")) {
                              // 画像出力
                              if($header){
                                   //header("Content-Type: image/gif");
                                   imagegif($dst_im);
                                   return "";
                              }else{
                            $dst_file = $dst_file . ".gif";
                              if($re_size[0] == $size[0] && $re_size[1] == $size[1]) {
                                  // サイズが同じ場合には、そのままコピーする。(画質劣化を防ぐ)
                                  copy($path, $dst_file);
                              } else {
                                  imagegif($dst_im, $dst_file);
                              }
                              }
                              imagedestroy($src_im);
                              imagedestroy($dst_im);
                         } else {
                              // 画像出力
                              if($header){
                                   //header("Content-Type: image/png");
                                   imagepng($dst_im);
                                   return "";
                              }else{
                                   $dst_file = $dst_file . ".png";
                              if($re_size[0] == $size[0] && $re_size[1] == $size[1]) {
                                  // サイズが同じ場合には、そのままコピーする。(画質劣化を防ぐ)
                                  copy($path, $dst_file);
                              } else {
                                  imagepng($dst_im, $dst_file);
                              }
                              }
                              imagedestroy($src_im);
                              imagedestroy($dst_im);
                         }
                    } else {
                         // サムネイル作成不可の場合(旧バージョン対策)
                         $dst_im = imageCreate($re_size[0], $re_size[1]);
                         imageColorAllocate($dst_im, 255, 255, 214); //背景色

                         // 枠線と文字色の設定
                         $black = imageColorAllocate($dst_im, 0, 0, 0);
                         $red = imageColorAllocate($dst_im, 255, 0, 0);

                         imagestring($dst_im, 5, 10, 10, "GIF $size[0]x$size[1]", $red);
                         imageRectangle ($dst_im, 0, 0, ($re_size[0]-1), ($re_size[1]-1), $black);

                         // 画像出力
                         if($header){
                              //header("Content-Type: image/png");
                              imagepng($dst_im);
                              return "";
                         }else{
                              $dst_file = $dst_file . ".png";
                              imagepng($dst_im, $dst_file);
                         }
                         imagedestroy($src_im);
                         imagedestroy($dst_im);
                    }
                    break;

               // jpg形式
               case "2":

                    $src_im = imageCreateFromJpeg($path);
                    $dst_im = $imagecreate($re_size[0], $re_size[1]);

                $imageresize( $dst_im, $src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]);

                    // 画像出力
                    if($header){
                         //header("Content-Type: image/jpeg");
                         imageJpeg($dst_im);
                         return "";
                    }else{
                         $dst_file = $dst_file . ".jpg";

                    if($re_size[0] == $size[0] && $re_size[1] == $size[1]) {
                        // サイズが同じ場合には、そのままコピーする。(画質劣化を防ぐ)
                        copy($path, $dst_file);
                    } else {
                        imageJpeg($dst_im, $dst_file);
                    }
                    }

                    imagedestroy($src_im);
                    imagedestroy($dst_im);

                    break;

               // png形式
               case "3":

                    $src_im = imageCreateFromPNG($path);

                    $colortransparent = imagecolortransparent($src_im);
                    if ($colortransparent > -1) {
                         $dst_im = $imagecreate($re_size[0], $re_size[1]);
                         imagepalettecopy($dst_im, $src_im);
                         imagefill($dst_im, 0, 0, $colortransparent);
                         imagecolortransparent($dst_im, $colortransparent);
                         imagecopyresized($dst_im,$src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]);
                    } else {
                         $dst_im = $imagecreate($re_size[0], $re_size[1]);
                         imagecopyresized($dst_im,$src_im, 0, 0, 0, 0, $re_size[0], $re_size[1], $size[0], $size[1]);

                         (imagecolorstotal($src_im) == 0) ? $colortotal = 65536 : $colortotal = imagecolorstotal($src_im);

                         imagetruecolortopalette($dst_im, true, $colortotal);
                    }

                    // 画像出力
                    if($header){
                         //header("Content-Type: image/png");
                         imagepng($dst_im);
                         return "";
                    }else{
                         $dst_file = $dst_file . ".png";
                    if($re_size[0] == $size[0] && $re_size[1] == $size[1]) {
                        // サイズが同じ場合には、そのままコピーする。(画質劣化を防ぐ)
                        copy($path, $dst_file);
                    } else {
                        imagepng($dst_im, $dst_file);
                    }
                    }
                    imagedestroy($src_im);
                    imagedestroy($dst_im);

                    break;

               default:
                    return array(0, "イメージの形式が不明です。");
          }

          return array(1, $dst_file);
     }
}
?>

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

httpヘッダーがどのようなものなのか詳しくないのですが、怪しいところをコメントで無効にしてみました。

// 画像出力
if($header){
//header("Content-Type: image/png");

5箇所ほどある、「// 画像出力」のすぐ下の「header」をコメントで無効に

発見できたのは、gdライブラリを使用していることから、ファイル名で当たりをつけて開いたら、先頭に「自動サムネイル作成」と書いてあったので一応特定。

まあ、運みたいなもんですね。。

↑のheaderを無効にすることで、何か他の不具合が出るかもしれませんが、今のところ問題ないようなのでとりあえずこのまま行く事にしました。

追伸:
ロリポップにEC-CUBEをインストールして、HTML・CSSを修正しようとすると、403ERRORが出てしまいました。

こちらの記事と同じ状況だと思うので、ご参考まで。
TeamShappa

ソースコードすっげはみ出してる・・・