こんにちはマイコン制御

May FORTH be with you.

とりあえず動くという事:追加

  • 担当している業務がようやっとベータ状態になってまだまだ作業は多いのですが一つ印象的なことがあったのでメモ。
    • 画像の扱いの話ではあるのですが、もっと根っこの話でもある。
  • CakePHPでデータベース上に保存し、表示するってかたちで画像を管理しようとしていました。
    • 保存して画面上に表示させるまではいくんですが、画像が画像無しアイコンにしかならなくて、エラい長く詰まることに。
      • 他の作業を順次進めてはいたんだけど、ついにこれだけ残ってしまいました。
  • トラブルの出発点になったところは以下のCakePHPソース
function imgview($id = null) {
    $this->layout = false;
    $this->autoRender = false;
    header('Content-type: image/jpeg');
    $posts = $this->Post->findById($id);
    echo $posts['Post']['image'];
}
  • 細部は違いますが、コントローラーで画像ファイルを読み込み、バイナリにヘッダを付けてあげて、このコントローラーを画像配置してあるURLに見立ててビューから読み込めば表示される。
    • はずなのですが、どうしてもうまく表示されませんでした。
  • 最初、2行目が入ってなくてリーダーに指摘されて入れたんですが、それでも表示されず、調べて3行目も追加してもまだだめ。画像無しアイコンのまま。
    • 4行目を省くと化け化けの文字列が表示されるので、データの格納が上手く行っていない訳ではないようです。
    • phpMyAdminから直接データを落として拡張子をjpegにすればちゃんとjpegファイルは見られました。
    • ヘッダでファイルの種類をtext/htmlにして字化け表示させて、そのページをダウンロードして拡張子をhtmlからjpegにしても正しく画像が表示されました。
  • ビュー側の問題かと思ってリンク先URLに.jpegくっつけてみたりしてもやっぱり駄目。
  • さー困った。
    • これからディレクトリに画像を直接あげる方式にすると、手戻りで時間もかかるし自分の現状のスキルでアップ、表示は良くても他データとの紐づけとか削除とかの管理とかが怪しいものになりそうだし悪手過ぎる。
    • こういう時、我流で上っ面だけ学んでいると何が原因なのか本当に判らない。
      • 自分の何かのミスなのか、バージョンが違うから方法が間違っているのか、CakePHPMySQLPHPそれぞれのバージョンの組み合わせで起こる特殊なエラーなのか、それともブラウザの問題なのか、勘所が全く判らない。
      • リーダーも調べておくとは言ってくれたけど、多分忙しくてこれどころじゃない。
  • ネット調べても画像表示の方法は山ほど出るけど、トラブル対処法はこの件に関しては見当たらない。
    • しょうがないのでCakePHPMySQLPHP、と一つづつググりながら調べていっても、特に間違ってはいないようで…。
      • いやまて、PHPじゃないけどPHPのところで似た問題見たような…、ってこれかー!
  • 結局問題は、何故かそのスクリプトUTF-8(BOM有)で保存されていたことで、BOM無しにしたらあっさり画像がブラウザ上で表示されました。
    • 要はBOMが悪さして、MySQLのデータを画像データにする際にデータを壊していたのでした。
  • これなんですよ、無自覚に取りあえず動くものに乗っかっていると何かあった時に打つ手が判らなくなるっていうのが怖いなあ、と思って。
    • でも何でこれBOM有にしてたんだろう?自分がやったのは間違いないんだけれど記憶が無い…。
      • なんか違うエディタで開いて保存したんだっけか?