プログラマーになりたい。

プログラミングや写真や本や読書会のことや、日常のこと。

CSV形式の表を画像化したい

完璧に車輪の再発明の再発明の…って感じで、さがせば絶対ある。
というか、ソースが出てないやつならばあった。ただ、それだと運営に責任が持てないし、カスタマイズができないので、却下せざるを得なかったのだけど。
と、ここまでは
CSVから表の画像を自動生成したい - nikki-da
のつづき。


あるいは、Flashつかって、ASとかで書いてもできるかもよ?とシステム系のえらい人にアドバイスされたんだけど、そっち方面は、以前書いたとおり完璧に守備範囲外だから今回はやめとくことにした。勉強にはなるけど、それにしても時間がかかりすぎる気がする。これ、一応納期はないけど仕事なんで。で、まあ個人的に妥当な線でいくと、PHPのGDを使う感じだろうなと。ただ、おれがバイト先の内部向けに開発をした細かいツールは、ぜんぶCakePHPでやってきたという経緯があるので、できれば統一したい。


で、きょう、時間があったので、要求される条件を軽くまとめて、それをGDで荒く実装してみた。四角がひとつーありましてー♪的に。ペライチでというか、つまり素のPHPファイル1つで書いたら動く。
ところが、どうもCakePHPが邪魔をしやがるらしい。最初のやつをビューファイルに入れて、ほぼ空みたいなコントローラをつくって、やってみるたら駄目だった。具体的にはブラウザの表示が真っ白。リクエストをtelnetで見るとか、結構しぶといことしたけど、結局何も出力してない感じだった。わけわからん。

それで、CakePHPのフォーラムに出てた方法に大体同じというか、ほとんどそのまんまのものを動かしてみた。

Re: 画像の出力について
どこかのコントローラに、

<?php
function outputimg(){
  $this->layout = 'ajax';
}
?>

と書いて、/views/そのコントローラ/outputimg.thtmlに、

<?php
header('Content-Disposition: inline; filename=test'); 
header('Content-Type: image/png'); 
$path = 'img/cake.power.png';
readfile($path);
?>


と書いてみてください。
私の場合、customersコントローラに書いたので、
http://cake_path/customers/outputimg/
としたところ、画像が表示されました。

という作業。いけるかと思ったんだけど。もしかしてCakeのバージョンアップで事情が変わったのだろうか。
それともサーバの環境のちがいか、あるいは他に原因があるのか…。

しかも、いま検索しなおしてみたら

$mime_type = 'application/octet-stream';
Header('Content-type: {$mime_type}');

なんて、「Content-Type: image/png」じゃない例が出て来たりして、余計混乱してきた。
ともかく、ぜんぜんどうにもできなくて、きょうはまいった。


まあ、べつにどーしてもCakePHPを使わないでもいいっちゃあいいのだが、どうもここまできてしまうと、悶々としたまま放っておく気になれないし。もうすこしがんばります。

追記

なんてこった。上記の引用したコードで、「png」になってる部分(たぶん2つ)をgifにしたら動きます。たぶんおれが使ってるのがCakePHP 1.2系統だから?
なぜなら、CakePHP 1.2系統には「img/cake.power.png」なんてファイルが無いからです!
つまり、単にreadfileが「ファイルにアクセスできねーよ!」とエラーしていただけだったみたい。ただ、エラーを全部殺してたせいで0バイト送信になってたわけです。ある意味CakePHPのせいではあるが、本当にこんなとこにバージョンの違いがあるとは思ってなかったぜ。
不覚。おれ、ばかじゃん…。まったくもう!
ちなみに、ためしにxreaでもやってみたら動いた(ローカルはMAMP)。

うーん、でもだとすると、当初の問題は解決してない…。コントローラに「$this-> autoRender = false; 」してあったのがいけなかったのだろうか…?この文で、ビューテンプレートの読み込みもされなくなるとしたら、何も出ないのは正しいあたりまえだけど。

Creative Commons License ©2007-2021 IIDA Munenori.