• ベストアンサー

PHPで画像を取得、保存する方法

以下で画像を取得、保存する事が出来ましたが、このプログラムで大丈夫でしょうか? 画像取得、保存の関数やもっと良い方法があれば教えて下さい。 <?php echo "あいうえお"; $temp=file_get_contents("http://www.google.co.jp/intl/ja_jp/images/logo.gif"); echo $temp; echo "<HR>"; $handle=fopen("test.gif","w"); fwrite($handle,"$temp"); fclose($handle); echo "<img src=\"./test.gif\">"; if(is_string($temp)) echo "STRING<BR>"; ?> 疑問点について。 上記プログラムですと、画像を入れた変数$tempが文字列として出力されますが、 1行目の、echo "あいうえお";をコメントアウトするとブラウザに画像が表示されるだけで、fopen,fwriteはきちんと処理されているのにechoの出力が無視されるのはどうしてですか?

  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • gon987
  • ベストアンサー率16% (53/313)
回答No.3

質問者は気が付きませんか? echo "<HR>"; echo "<img src=\"./test.gif\">"; if(is_string($temp)) echo "STRING<BR>"; も処理されてないことが 画像は echo "<img src=\"./test.gif\">"; で表示されているのではなく echo $temp; で表示されていることを ついでに保存されたファイルではなくてブラウザに表示されている画像ファイルを右クリックで保存してバイナリエディタでもテキストエディタでもいいから開いて最後の部分みてみな。 <HR><img src="./test.gif">STRING<BR>が見事に埋め込まれているから >で「Content-type」が(text/htmlでなく)image/gifになっていると思います。 ここら辺の挙動も確認してみると自分の開発環境だと変なんですよね。 header("Content-Type: image/gif"); を入れる入れないで見た場合 右クリックでの保存時とプロティ ・入れた場合 ファイル名:●● ファイルの種類:GIFとBMP プロパティの種類:GIF イメージ ・入れなかった場合 ファイル名:●●.htm ファイルの種類GIFとBMP プロパティの種類:HTML Document ということでIEだと勝手にヘッタから解釈してやってくれている。 だからFirefoxではheader("Content-Type: image/gif");を入れないと echo $temp;をそのままの文字列として出力する。

narusuji
質問者

お礼

表示されるgifもどき?の画像が、echo $temp;で表示されている事はわかります。 ご回答を参考に、echo "あいうえお";をコメントアウトした場合に表示される画像を右クリックで保存しようとしてもGIF形式で保存されませんでした。 保存したファイルをバイナリエディタで開くと、 gif形式の終端記号らしき"0x3B" のあとにechoで出力した、 <HR><img src="./test.gif">STRING<BR> が見事に追加されていました。 PHPを勉強中で、"画像を取得して表示、保存してみたい"と思い書いたプログラムで合点がいかなかったので質問させてもらいました。 画像ファイルっぽいのに、<HR><img src="./test.gif">STRING<BR>が追加されている事は非常に興味深かったです。 ありがとうございました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

たぶんこんなことがしたいのでは? <?php if($_GET["file"]){ header("Content-Type:image/gif;"); readfile($_GET["file"]); }else{ $file="http://www.google.co.jp/intl/ja_jp/images/logo.gif"; $file=urlencode($file); print <<<eof あいうえお <img src="{$_SERVER["PHP_SELF"]}?file={$file}" /> <hr /> eof; } ?>

narusuji
質問者

お礼

すみません、スーパーグローバル変数がまだよく理解できていません。 プログラムは問題なく動いたので参考にさせてもらいます。 どうもありがとうございました!

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>1行目の、echo "あいうえお";をコメントアウトするとブラウザに画像が表示されるだけで、 >fopen,fwriteはきちんと処理されているのにechoの出力が無視されるのはどうしてですか? サーバの設定がわかりませんが、テキスト出力がなくバイナリ($temp)の出力だけなので「Content-type」が(text/htmlでなく)image/gifになっていると思います。なので画像はちゃんと表示されますが、逆にそのあとのテキストは「バイナリのゴミ」としか認識されません。 サーバからブラウザに返すものは1回のやりとりではひとつのContetn-typeだけしか使えません。このあたりはHTTPの仕組みを考えればわかると思いますが・・。HTMLでは(imgタグなどで)「ブラウザから要求し直してもらう」という方法で複数のコンテントを1ページに表示していますが、HTTPとしては「どちらか」しか返せません。

narusuji
質問者

お礼

今までContent-Typeを意識した事はありませんでしたが、意識する良いきっかけになりました。 知識不足を改めて感じました。。 ご回答ありがとうございました。

関連するQ&A

  • fopenの使い方?(画像の保存)

    お世話になります。 exif_thumbnailで取得したサムネイル画像をjpgファイルとして元画像ファイルとは別名で保存したいと考えています。 テストで以下のようなコードを作成しましたが、うまく保存できません。fopenの基本的な使い方が間違っているのではないかと思っていますが、どこがおかしいのかわからずにおります。 <?php $img = exif_thumbnail("./test.jpg", $width, $height, $type); $handle = fopen ("./thumb.jpg", 'a'); fwrite($handle, $img); ?> ちなみにPHPのバージョンは5.0.3です。 echo($img);でサムネイル画像が取得できていることは確認できております。 要はtest.jpg → $img → thumb.jpgとできればいいのですが。。 どうしたらうまく保存できますでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • 画像をバイナリで開く

    開けることには開けるのですが、ものによって開けなかったりします。 test.gifをadobe fireworksで製作。 $img=fopen($dir."test.gif","rb"); ←windows これが開けるファイルだとして、 それをadobe fireworksでサイズ変更し、同じ名前で保存。 上記にて$imgをechoするとInvalid argumentとなっています。 fopenの時点でエラーになっていて、パス等はあっています。 拡張子等は今のところgifなんですが、開けるものと開けないものがあるのはなぜでしょうか。 考えられる原因はなんでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHPで外部サイトの内容を取得する方法

    いまPHPをやっているのですが。外部サイトのソースを文字列で取得する方法はあるのでしょうか? (例えばwikipediaの内容を文字列で取得して echo で表示させたい) wikipediaの内容はソースを見れればいいだろうと思ったからです。 fopenでURLを入れれると書いていたのでしてみたのですがタイムアウトしてうまくいきません。 なので例としてwikipediaのページのソースを取得しechoで表示させるプログラムを教えていただけませんでしょうか?。よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで画像処理

    あるWebサイトにある画像を定期的に取得して,PHPで画像を処理をしてサーバーに保存するプログラムを作ろうとしています. 処理したい画像の形式はGIFです.特にGIFにこだわりはないので違うフォーマットに変換してから処理してもいいとは思っています. 画像処理と言っても,特定のRGB値のピクセルを画像中から探して,その座標を取得するという単純なものなのです. そんなに難しくなさそうなのですがどうやればいいかわからないのでどなたか教えていただけませんか? GDやImageMagickが使えるのかと思って動かしてみましたが,結局使えそうな関数がみつからず頓挫しています. どなたかよろしくお願いします.

    • 締切済み
    • PHP
  • 携帯メールから添付画像ファイルを取得する方法について

    現在、PHPを使って携帯サイトを作成しています。そこでPEARライブラリのMail_mimeDecodeを使って、添付ファイルの画像を抽出したいと思っています。 「PHP携帯サイト実践アプリケーション集」という書籍を参考にしています。 最初にMail_mimeDecodeを使ってメールを分解して画像を含むものについては 構造体として $image['type'](画像の形式) $image['name'](画像のファイル名) $image['body'](画像の本体) を取得します。 次に一時ファイルを作成して、そこに画像の本体(body部分)を書き込んでいます。 $temp_path=tempnam('/tmp,'img_'); $fp=fopen($temp_path,'w'); fwrite($fp,$image['body']); ←画像のbody fclose($fp); その後、画像の形式を確認して、画像ファイルに変換して変数$imagesourceに代入しています。 list($width,$height,$type)=getimagesize($temp_path); if($type==IMAGETYPE_GIF){ $imagesource=imagecreatefromgif($temp_path); }else if($type==IMAGETYPE_JPEG){ $imagesource=imagecreatefromjpeg($temp_path); }else if($type==IMAGETYPE_PNG){ $imagesource=imagecreatefrompng($temp_path); } その後 //一時ファイルを削除 unlink($temp_path); //--------<わからない部分>-------------- $path=tempnam('/home/xxxx/www/mobile/img',''); $image_save_path=$path; imagejpeg($imagesource,$image_save_path); このようなかんじで画像ファイルを取得しているようなのですが、上の3行がわかりません。最初に一時ファイル(接頭辞にimg_)を作って画像のbodyを書き込むというのは、画像ファイルを作成するための準備作業用として使っているのかなという認識でいます。 しかし上の3行でもう一度一時ファイルを作成して(接頭辞が' ')、それをimagejpegで一時ファイルに出力しています。なぜ一時ファイルを使うのでしょうか? $path='/home/xxx/www/mobile/img'; imagejpeg($imagesource,$path); 上2行ではいけないのかなと思い、ためしましたがだめでした。 一時ファイルの作成(tempnam)はどのようなときに使うのでしょうか。なにぶん初心者のため、わかりやすい説明で教えていただければ幸いです。

    • ベストアンサー
    • PHP
  • 携帯サイトの画像アップロード[PHP+MySQL]

    携帯サイトの会員マイページで 個人の画像をアップできる仕様を制作したいのですが (ブログやsnsサイトによくある、アバターの代わりに  画像をアップできる仕様です) どうしてもDBの更新・画像のアップロード、双方ができず 困り果てております。 ※メールエラーログをみてみたところ、  メールをトリガーとしてプログラム自体は動作していた  ものの、処理が途中でストップされておりました。 具体的には、下記のような仕様を考えています。 (1)アップしたい画像を添付して携帯メールを送信 (2)メールをトリガーとして画像アップロード&DB更新  プログラム起動 ~以下プログラムの中身の動作~ (3)届いたメールアドレス(拡張メールアドレス)から会員ID情報を  取得 (4)会員情報テーブル(sns_user)にマッチする会員IDの列の  image_pathの項目にアップロードした画像のパスが  更新される。  PHP+MySQLで制作中です。  「update テーブル名 set where 条件~」で調べてみたものの、  どうしても分からず質問させていただきました。  どなたかお分かりになられる方がいらっしゃいましたら  ご教授いただけませんでしょうか。 以下ソース内容 // ユーザー&認証コードチェック if ($user&&$auth_code==getAuthCode($user['id'], $user['auth_string'])) { // 認証OK // マルチパートの場合のみメールを解析して画像を取得 if (strtolower($structure->ctype_primary) == "multipart") { $images = getImage($structure->parts); } $image_save_path = null; // 画像リストの中から1つだけ画像を取得する foreach ($images as $image) { // コンテンツタイプのチェック if ($image['type'] == 'image/jpeg' || $image['type'] == 'image/gif' || $image['type'] == 'image/png') { // ファイルとして保存 // 一時ファイルパス $temp_path = tempnam('/tmp', 'img_'); if ($temp_path == false) { // error break; } $fp = fopen($temp_path, 'w'); if ($fp == false) { // error break; } fwrite($fp, $image['body']); fclose($fp); // 画像の形式と縦横サイズを取得 list($width, $height, $type) = getimagesize($temp_path); // 認識できる形式であれば、所定のメソッドで開く $ext = ".jpg"; $imageSource = null; if ($type == IMAGETYPE_GIF) { $imageSource = imagecreatefromgif($temp_path); $ext = ".gif"; } else if ($type == IMAGETYPE_JPEG) { $imageSource = imagecreatefromjpeg($temp_path); } else if ($type == IMAGETYPE_PNG) { $imageSource = imagecreatefrompng($temp_path); $ext = ".png"; } // 一時ファイルを消す unlink($temp_path); if ($imageSource) { // ファイル名決定 $path = tempnam($image_dir, ''); $image_save_path = $path . $ext; // 画像をケータイディレクトリへファイル保存 imagejpeg($imageSource, $image_save_path); imagedestroy($imageSource); break; } } } if ($image_save_path) { // 差出人取得 $from = getFrom($structure->headers['from']); $params = array(); $params[] = $user['id']; $params[] = $image_save_path; // データベースへ接続する // if ($db = connectDB($db_user, $db_pass, $db_name, $db_host, true)) { $sql = "update sns_users set image_path = '$image_save_path' where id = '" . mysql_real_escape_string( $_SESSION['id'] ) . "'"; execQuery($db, $query, $params); } } $query = "select * from sns_users where id = ''"; $result = mysql_query( $query ); $user = mysql_fetch_array( $result ); // データベースを閉じる closeDB($db); } ?>

    • 締切済み
    • PHP
  • PHPで.jsonを保存せずにデータの取得

    はじめまして、よろしくお願いいたします。 ポストで送信した値が.jsonにて外部ドメイン(クロスドメイン)にて戻ってくるのですが、ブラウザ側で保存タブが出てしまいます。 この.jsonファイルを保存せずにPHP側で取得して出力をしたいのですが、どのようにしたら取得できるのかを解る方がおられましたら教えてください。 以下のような感じで試しましたが取得できませんでした。 いろいろ試しましたが、どうやってもブラウザに保存タブが出てしまいます。 以下サンプルコード $json_string = file_get_contents('php://input', true); $obj = json_decode($json_string); var_dump($obj); よろしくお願いいたします。 ※OKWAVEより補足:テーマ「php」から投稿された質問です。

    • ベストアンサー
    • PHP
  • phpのエラー

    phpで $fp = fopen("test.txt", a);//ココ1 $jyusin = $_POST['score'];//ココ2 fwrite($fp, $jyusin); fclose($fp); $f = fopen("test.txt", r);//ココ1 echo fgets($f); fclose($f); ココ1の場所でUse of undefined constant...というエラー ココ2の場所でUndefined index...というエラー 上記のエラーはどうしたら直りますか。 因みにissetで隠す方法以外でお願いします。

    • ベストアンサー
    • PHP
  • PHP 別ドメインへのファイル保存法

    phpプログラムでわからないことがあるのですが。 レンタルサーバを2つ(AとB)もっているとします。 AからBにファイルを保存したいのです。 これは可能なのでしょうか、 可能でしたらコードの記述法を教えていただきたいのです。 たとえばこのような感じです。エラーになります。 <?php $write_data = "123456"; if($fn = fopen("ftp://b@b.com/public_html/b.com/test.data", 'a')) { fwrite( $fn, $write_data); fclose($fn); } ?>

    • ベストアンサー
    • PHP
  • 【PHP】書き込みできません

    PHP5.3の環境でファイル書き込みのロジックがうまくいかずに困っています。 環境は下記の通りです。 Apache 2.2.2 PHP 5.3.3 コードは下記の通りです。 >>CODE $file_path = "/home/xxxxx/logs/test.txt"; echo file_exists($file_path); echo "file_path1=".$file_path; if ( file_exists($file_path) ) { echo "file_path2=".$file_path; // ファイルポインタ取得 if ( ($fp = fopen($file_path, 'a')) !== FALSE ) { // ログは追記 echo "file_path3=".$file_path; // ファイルポインタに書き込み fwrite($fp, $date."\n"); fwrite($fp, $body); fwrite($fp, "----------------------------------------------------\n"); // ファイルポインタクローズ fclose($fp); $flg = true; } } <<CODE 権限は下記の通りです。 logs 777 test.txt 777 現象は下記の通りです。 echo文のfile_path1は表示されます。 echo文のfile_path2及びfile_path3は表示されません。 $file_path="/home/logs/test.txt";に変更すると、 echo文のfile_path1及びfile_path2が表示されます。 echo文のfile_path3は表示されません。 ファイルが存在することはlsで確認したので間違いありません。 権限も777にしているので、何がおかしいのか困り果ててしまい、初めて投稿させて頂きました。 PHPやApacheの設定ファイル等も問題あるのでしょうか。 どうぞご指摘お願いいたします。

専門家に質問してみよう