CakePHP

2013年03月22日

【PHP】スマホで動的に取得した画像を表示させようとしたらダウンロードが実行される【image/pjpeg】

久しぶりにプログラム関係のメモです。
言語はPHP

とあるWebシステムで、アップロードした画像ファイルを非公開の場所に起き、その場所を知られないように画像を表示するプログラムを組みました。

そのプログラムを実行すると、PCでは表示されるのにスマホだとダウンロードが実行されるという事象が起きました。今回はそのときの解決策の内容です。

まずは作成したプログラムは以下の通りです。
ファイルをアップロードしたときにファイルタイプとファイルサイズを取得し、その値を使っています。

header("Content-type: $header");
header("Content-Length: $size");

$fp = fopen($path, 'rb');

if($fp){
  while(TRUE){
   if(feof($fp)){
    break;
   }
  $ret = fread($fp, 1024);
  print $ret;
  ob_flush();
  flush();
 }
}
fclose($fp);

といった感じです。
どうしてダウンロードが実行されてしまうのか正確な理由は調べていませんが、犯人は突き止めました。

ファイルタイプ $header の値が犯人でした。

アップロードされた画像ファイルのファイルタイプを調べてみると「image/pjpeg」となっていました。軽く調べたところIEからアップロードすると「image/pjpeg」となってしまってあちこちでエラーを起こしている嫌われ者のようですが、まさにこいつが犯人でした。よって、これを

$header = str_replace("image/pjpeg", "image/jpeg", $header);

と通常の「image/jpeg」に変換する処理を入れたら問題なく画像が表示されました。
スマホだと「image/pjpeg」なんてヘッダーは知らん!知らんヘッダーは何をしたらいいかわからないからとりあえずダウンロードだ!ってことになるんですかね。
とりあえず解決して良かったです。

bluestylecom at 11:10│Comments(0)TrackBack(0)

2013年01月31日

急にsimplexml_load_fileが動かなくなった

仕事のPHPプログラムメモ。
カテゴリはCakePHPですが、今回はCakePHPは関係ないPHPの話しで個人的なメモです。

仕事で作成しているサイトでamazonなどのデータを取得していたのが、急に取得出来なくなった。
最初はAPIの仕様変更があったのかと思ったのだが特に仕様変更があった様子はない。
amazonのデータを取得するときに叩くURLをブラウザでアクセスすると普通にxmlが取得出来る。
amazon側の問題ではなさそう。
そもそもローカル環境では問題なく動作している。

次に自分のプログラムでデバッグしてみると

$xml = simplexml_load_file($url);

で、xmlデータを取得する箇所でデータが取れていないことが判明。
file_get_contentsで叩いてもデータが取れないことも判明。

ここで同じサーバで動かしている別のプログラムが不安になり、動かしてみると送信されてくるはずのメールが届かない。
そのサーバのメールサーバからメールを送ろうしても送信されない。
そこでメールのログをみてみると

Host or domain name not found. Name service error for name=ドメイン名 type=MX: Host not found, try again)

というエラーが…
どうやらDNSサーバ(ネームサーバ)がきちんと動作していないようだ。

simplexml_load_fileもfile_get_contentsはドメインからIPアドレスを取得出来ないと動作しないようだ。
IPアドレス直打ちなら行けるらしい。

そんなこんなで犯人がDNSだと判明。
ここからはサーバ管理をしている人の領域なのでその人に任せる。

結果、DNSサーバ自体は特に問題がなく、Apacheの再起動でも解決せず、サーバの再起動で無事に解決。
ただ、なぜDNSに繋がらなくなったかは不明のまま。

まぁ、この世界では再起動で直ることは良くあるので深くは考えないことにしよう。
とりあえずまたこの事象が起きたら再起動ってわかっただけでも収穫だ!

bluestylecom at 12:33│Comments(1)TrackBack(0)

2010年07月17日

kcaptchaの認証エラーを$form->errorで表示する

 現在システム開発で使用しているCakePHPの技術メモです。ほとんどの人は関係ないと思うので無視して下さい。。続きを読む

bluestylecom2 at 16:43│Comments(0)TrackBack(0)