質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

7449閲覧

readfile() の Header

ryohasegawa

総合スコア437

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/04/25 13:18

編集2017/04/29 12:53

readfile() を使って画像を読み込んで表示したんですが、文字化けしてしまいまして、直すには Header を書くみたいなんですが、全く知識がなくわかりません。
教えてください。

###追記
コードは以下です。

php

1 public function usericon_read(){ 2 header("Content-Type: image/png"); 3 return readfile("./../users/icons/".$this->me()->id.".png"); 4 }

画像と同じ名前でtxtファイルを作ってみて表示してみると表示しました。画像だけが表示しない感じです。

元画像
イメージ説明

表示結果は画像表示っぽくなったんですが、表示しません。
イメージ説明

###追記2
gallu さんの回答を元にコードを書いてみました。

php

1<?php 2 3namespace MyApp\Module; 4 5class read_iconfile{ 6 public function __construct(){ 7 header("Content-Type: image/png"); 8 readfile("./../../users/icons/hasegawaryou.png"); 9 } 10} 11

※hasegawaryou のところにユーザのIDが入るように後で改善します。

html

1<img src="./../lib/Module/read_iconfile.php" />

イメージ説明
ファイルのパスも問題ないと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

readfileを絶対に使わなければならないのでなければ、質問者さんが実現したい挙動は以下のように実現できると思いますが、いかがでしょうか?
また、finfo_*という関数は、fileinfoという拡張モジュールの関数で、場合によってはphp.iniからphp_fileinfo.dllを有効にしなければなりません

PHP

1<?php 2function getImage($filepath) 3{ 4 $mimelist = ["image/gif", "image/jpeg", "image/jpg", "image/png"]; 5 6 if (file_exists($filepath)) { 7 $fileinfo = finfo_open(FILEINFO_MIME_TYPE); 8 $mime = finfo_file($fileinfo, $filepath); 9 if (in_array($mime, $mimelist, true)) { 10 $image = file_get_contents($filepath); 11 return "data:" . $mime . ";base64," . base64_encode($image); 12 } 13 } 14 return false; 15} 16?> 17<!DOCTYPE html> 18<html lang="ja"> 19<head> 20 <meta charset="UTF-8"> 21 <title>タイトル</title> 22</head> 23<body> 24<img src="<?= getImage("test.png"); ?>" alt="画像"> 25</body> 26</html>

投稿2017/04/25 14:24

編集2017/04/25 14:36
s8_chu

総合スコア14731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「画像の出力」で「文字化け」でしょうか?
可能性としては
・本当は画像が出力されてほしい
・でも、実際には「よくわからない文字が出力されている」
という状況であるように思われましたが、如何でしょうか?

もし上述だとしますと、書かれている通り「headerを出力する」必要があります。
headerは色々な用途で使いますが、今回書く「Content-type」は、「これから**を出力するよ~」という、ブラウザに対する合図のようなものです。
デフォルトではPHPは「text/html(HTMLを出力するよ)」となっているので。
画像を出す場合は、明示的に記述して「画像を出力するよ」と、教えてあげる必要があります。

プログラムですが、おそらく

PHP

1<?php 2// ファイルから画像を読みだして出力する 3readfile( $ファイル名 );

と書いてあるかと思います。
この、readfileの前に、以下のようなコードをさしはさみます。

PHP

1<?php 2// ヘッダを出力する 3header('Content-Type: image/jpeg'); 4// ファイルから画像を読みだして出力する 5readfile( $ファイル名 );

上述は、出力するファイルが「Jpegである」と仮定した場合です。
もしgifの場合は、「image/jpeg」の所を「image/gif」に、pngであれば「image/png」に変更してください。

上述でおそらく画像が出力されると思うのですが、もしされない場合は、元のソースコードを、可能な範囲で書いていただくと、もう少し詳しく回答できるかもしれません。

投稿2017/04/25 13:27

gallu

総合スコア506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2017/04/25 14:00

追記させてもらいました。 画像は表示しません。 それと、一つ質問なんですが、画像表示すると、自動で全画面表示いたいになるんですか?
gallu

2017/04/25 14:26

追記を拝見しました。 ちょっと、プログラムの全体が見えない感じなので、コメントがしにくい所なのですが。 画像で張り付けていただいたHTMLを見ていると、IMGエレメントのsrcアトリビュート値が「http://192.168.12.9:9000/」となっていたので。 9000番で待ち受けているhttpの、設定次第ではあるのですがおそらくは index.php なり、といったファイルにPHPが記述されている感じでしょうか。 コードが ```PHP public function usericon_read(){ header("Content-Type: image/png"); return readfile("./../users/icons/".$this->me()->id.".png"); } ``` となっているので ・全体としては、クラス(OOP)な作りになっている 事はわかるのですが、前後にどのような処理をされているのかがわからないので、回答が些か難しい状態ではあります。 また、「画像は表示しません。」というのは「画像を表示したいけれども、実際には表示されていない」という意味合い、と考えてよいでしょうか? この手のものは、一つづつ解決をしていかないと、混乱が激しくなる事が多いので。 まずは、以下を確認したい、と思います。 1) http://192.168.12.9:9000/ (おそらくはindex.php?)のプログラムは、全体として「画像を出力するためのプログラムである」YesかNoか 2) もし1番が「No」である場合、(おそらくはindex.php?)のプログラムは「何をする(あるいはしたい)コードか」 3) もし1番が「Yes」である場合、ブラウザで直接 http://192.168.12.9:9000/ をアクセスしたら、何が表示されるか 以上あたりを、まずはお伺いしたいと思います。
ryohasegawa

2017/04/26 14:12

1の解答なのですが、index.phpファイルはページを表示するhtmlも記述してあり、別PHPファイルの関数を呼び出したりして構成しています。で、画像表示のプログラムも別ファイルに関数として記述してある感じです。 3の解答ですが、 http://192.168.12.9:9000/ にアクセスしても現在のページがトップページなので、同じページが表示するだけです。
gallu

2017/04/27 13:33

比較的簡単な方法、ではあるのですが。 まず「HTMLを記述するファイル」と「画像を出力するプログラム(ファイル)」は、切り分けて別のもの、にしたほうがよいです。 その上で。 「HTMLを出力するもの」は一端できている、と仮定をして、それとは「別に」、画像を出力するプログラム、を、別ファイルで書いた方がよいと思います。 例えば、なのですが。今、index.php(だと思われる)ファイルがあるところと同じディレクトリに、「image_put.php」というファイルを作って、そこに「画像を出力するだけの処理」を書いて、ブラウザで、 http://192.168.12.9:9000/image_put.php を叩いてみてください。 この状況で「とりあえず画像が適切に出力される」ところまでいけば、あと少しで解決する、と思われます。
ryohasegawa

2017/04/28 12:56

そのような業界ではどのようにやっているかわからないんですが、モジュールというものに分けて、HTML表示モジュールと画像表示モジュールに分けるということですか?
gallu

2017/04/28 13:59

「モジュール」という単語も割とあちこちで色々な意味合いで使われるので、是とも非とも言い難い所ではあるのですが。 とりあえず、お話を拝聴している限りですと「HTMLを表示するためのプログラム」と「画像を表示するためのプログラム」は、切り分けておいたほうが楽だしわかりやすいと思います。
ryohasegawa

2017/05/05 01:39

morisoba さんの回答が一番近い形になりますね。 そのとおりに書いたのですが上手く参照できないんですよねー テストでテキストドキュメントを参照させたらうまく表示はできたんですが・・・・
guest

0

ベストアンサー

添付された画像をじーっと見るとコンソールログになにやら "Resource interpreted as Document but ..." などとおかしなメッセージが出ていますね。

まずはブラウザの URL 欄に直接 "http://192.168.12.9:9000/" と打ち込んでみて下さい。
これで画像が出るなら html 側の問題。
出ないなら PHP 側かの問題。もしくは URL が間違っている。

コンソールログの内容からすると、ちゃんとPHP側でヘッダーを送っていないように見えます。
どんなコードを書いているか、質問に書いてください。
↑追記: ヘッダーはイメージなのに、内容がテキストなんじゃない? とブラウザさんがおっしゃっているので、ファイルがちゃんと読み込まれていないのかもです。

また、Chrome のデベロッパーツールの "Network" タブからどのようなデータがサーバから送られているか見ることが出来るので、そこでも想定通りのデータが送られているのか確認しましょう。


追記です。

超単純に書くと、

index.html

html

1<img src="getImage.php" />

getImage.php

php

1<?php 2header("Content-Type: image/png"); 3readfile("someImage.png");

同じディレクトリに上記2つのファイルと画像ファイルを入れてブラウザで index.html を表示すると画像が出ます。

投稿2017/04/25 14:19

編集2017/04/28 18:17
morisoba

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morisoba

2017/04/25 14:41

再度追記されたコードが断片なのでよくわかりませんが、 `return` は明らかに余計。
morisoba

2017/04/25 14:45

あ、一概に余計とは言えないか。 画像を表示すればOKなら、 return とっぱらって、readfile の直後に exit しましょう。 readfileの結果を受けてまたなにか別の処理をするのでなければ。
ryohasegawa

2017/04/26 14:07

http://192.168.12.9:9000/ はサーバーのファイル構造のhtml内のpublicフォルダの事で、画像ファイルはhtml内のusers/icons/に入っています。なのでhttp://192.168.12.9:9000/にアクセスしても、現在のページが表示するだけです。
morisoba

2017/04/26 16:02

じゃあ、img タグの src 指定が間違っていますね。 src にはあなたの作った画像を出力する php を指定してください。
ryohasegawa

2017/04/27 13:02

そのプログラムを書いてあるところが、他のPHPプログラム、データベースをログイン状況を確認したりするプログラムと同じファイルに書いてあるんですが、この画像参照のPHPは、別ファイルに書いたほうがいいってことですか? もし、今みたいに書いてあって、関数名で呼び出したりすることも可能ですか? 今回の場合はusericon_readという関数名で作ってあるんですが・・・
ryohasegawa

2017/04/29 09:26

追記ありがとうございます。 助かります。 これはこれで専用のファイルを作らないと行けないんですよね?
ryohasegawa

2017/04/29 09:42

それと、自分の場合はログインしたユーザのアイコンを参照したいので、ユーザのIDを渡して画層を参照っていう風にはこのコードだと不可能ですよね? それは、  getImage.php 側でユーザのIDを取得して、ファイルパスに埋め込むしか方法はないですかね?
morisoba

2017/04/29 14:16

自分の回答例で言うと、getImage.php を呼び出す際にユーザーIDを渡すと実現できます。 src="getImage.php?userId=xxxxx" みたいな呼び方にし、そのパラメータを使ってユーザー毎のアイコンを読み込みます。
ryohasegawa

2017/04/30 13:13 編集

なるほど。 別の話になるのですが、追記で書かせていただいたんですが、このように書いても上手く呼び出せないんですよ・・・
guest

0

回答は色々書かれているので補足になりそうですが

  • ファイルがUTF8で書かれているならBOMなしにする
  • できればreadfileはつかわずfopenfreadprintで処理する
  • よみこみの前にheader以外の出力を絶対におこなわない
  • 保険でob_clean()を併用する(readfileなど出力の直前)
  • 出力した直後にexitで抜ける

投稿2017/04/26 01:11

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問