phpで、動的に画像を生成した場合(ファイルとして保存せずに生成・表示)、

その画像をブラウザで保存しようとすると、
本来の形式ではない形式で保存されてしまいます。

例えば、imagejpeg でjpegを生成したのに、
ブラウザで保存するときに bmp になってしまったり、
携帯電話だと png 形式で保存されてしまったりします。

<img src="http://aa.bb.com/gazou.php?id=1">

などのように「拡張子」を表示していないため、
こうなっているのかな、と推測しています。


これを解決する方法はあるのでしょうか?

正しい画像形式で保存できるようにしたいと思っています。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/11/08 15:50:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:GEN111 No.1

回答回数472ベストアンサー獲得回数58

ポイント20pt

画像を出力する前に

header('Content-Type: image/jpeg') ;

とかしてますか?

id:onigirin

どうもありがとうございます。

設定を「png」にしていました。。。

「jpeg」に修正したところ形態とfirefoxは直りましたが、

IEだと「bmp」のままでした。

2007/11/01 17:01:03
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント20pt

Content-Type を明示的に指定してやることによりファイルの形式をブラウザに伝えられます。

また、Content-Disposition ヘッダを出力してやれば保存する際のファイル名をブラウザに指定することも出来ます。

header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=foo.jpg");

↑この例では画像の右クリック保存、及びURL直接表示でメニューからファイルに保存のどちらを行っても foo.jpg という名前がデフォルトのファイル名になります。

Content-Type だけの場合は IE の場合だと直接URLでメニューから保存をしたときにはjpgとして認識されないようで上手くいきません、右クリック保存ならContent-Typeだけでもgazou.php.jpgやgazou.jpgという風になります。

なので両方のヘッダを出力しておくのが無難だと思います。

id:onigirin

どうもありがとうございます。

携帯、firefoxの場合は正常に処理できましたが、

IEで右クリック保存した場合は、やはり「bmp」と認識されてしまいました。

ファイル名は初めて知りました。

使ってみたいと思います。

2007/11/01 17:02:02
id:y-kawaz No.3

回答回数1422ベストアンサー獲得回数226

ポイント20pt

VistaのIE7では右クリック保存でもいったんですが、XPのIE環境が先程は手元にないので試せませんでした。

ところで以下のように PATH_INFO を利用してリンクの書き方でURLが画像であるように見せかけるのはどうでしょうか?

<img src="http://aa.bb.com/gazou.php/foo.jpg?id=1">

php の後ろに/とセットでダミーのファイル名を書いてもきちんと対象の php で処理されるので php 側は何も変える必要がありません。

ちなみに /foo.jpg の部分は php からは $_SERVER['PATH_INFO'] で取得することも出来ます。

id:onigirin

どうもありがとうございます。

XP&IE6の組み合わせでのバグなんですかねぇ・・・。

http://aa.bb.com/gazou.php/1.jpg

のように .jpg 等にしてみましたが、「BMP」でしか保存できなかったです。

2007/11/01 17:48:18
id:Bookmarker No.4

回答回数191ベストアンサー獲得回数34

ポイント20pt

普通は、「Content-Type: image/jpeg」だけで良いはずなんですが、IE6 は、Content-Type: ヘッダーではなくファイル名(拡張子)でファイルの種別を判断するというバグがあるので、うまく行かないのだと思います。

回答2で id:y-kawaz さんが書かれているように、ファイル名も指定すると IE6 でもうまく行くはずです。

# XP + IE6 で確認しました。

id:onigirin

どうもありがとうございます。

それが、ファイル名指定もしているのですが、

何故かIE6では反映されないみたいで・・・。

数台のPCでチェックしましたが、同じ結果でした。

2007/11/01 18:51:27
id:yoshi-ken No.5

回答回数5ベストアンサー獲得回数0

ポイント20pt

.htaccessは使えますか?

使えるのであれば、mod_rewriteを用いるのがベストです。

であるところを

としてアクセスできる方法を紹介します。


現在gazou.phpが置かれている場所に

RewriteEngine on

RewriteBase /

RewriteRule ^gazou_([0-9]+)¥.jpg gazou.php?id=$1 [L]

と書かれたhtaccess.txtというファイルをアップロードして、

その後 htaccess.txt から .htaccess へリネームしてください。

もし既にある場合には、追記する形で行えば問題ないでしょう。

id:onigirin

どうもありがとうございます。

実は既にリライトしていて、

http://aa.bb.com/gazou.php/1.jpg

http://aa.bb.com/1.jpg

等にしましたが、結果は同じでした。

そのため、jpgで生成されていない気がしますが、

firefox等ではjpgで保存することができるので、よくわからない状態です。

2007/11/05 06:13:11
  • id:Bookmarker
    > ファイル名指定もしているのですが、何故かIE6では反映されないみたいで・・・。

    おかしいですね。私の環境ではちゃんと JPEG イメージと認識されるんですが…、
    IE6 のキャッシュをクリアしても駄目ですか?

    Internet Explorer で画像がビットマップ (.bmp ファイル) として保存される:
    http://support.microsoft.com/kb/810978/ja
  • id:onigirin
    ありがとうございます。

    マイクロソフトのページに沿ってみましたが、ダメでした。。。
    複数のPCで同じ状況になったので、
    プログラム側で何かおかしな部分があるのかもしれません。

    http://aa.bb.com/gazou.php/1.jpg

    でもbmpで保存されるので、
    どこかでおかしな処理をしている気がしますが、
    firefoxだと正常にファイル名も指定通りになるので不思議です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません