とりあえず動くという事:追加
- 担当している業務がようやっとベータ状態になってまだまだ作業は多いのですが一つ印象的なことがあったのでメモ。
- 画像の扱いの話ではあるのですが、もっと根っこの話でもある。
- 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くっつけてみたりしてもやっぱり駄目。
- さー困った。
- ネット調べても画像表示の方法は山ほど出るけど、トラブル対処法はこの件に関しては見当たらない。
- 結局問題は、何故かそのスクリプトがUTF-8(BOM有)で保存されていたことで、BOM無しにしたらあっさり画像がブラウザ上で表示されました。
- 要はBOMが悪さして、MySQLのデータを画像データにする際にデータを壊していたのでした。
- これなんですよ、無自覚に取りあえず動くものに乗っかっていると何かあった時に打つ手が判らなくなるっていうのが怖いなあ、と思って。
- でも何でこれBOM有にしてたんだろう?自分がやったのは間違いないんだけれど記憶が無い…。
- なんか違うエディタで開いて保存したんだっけか?
- でも何でこれBOM有にしてたんだろう?自分がやったのは間違いないんだけれど記憶が無い…。