画像の出力など ↑
printとecho(header()関数を使う) ↑
- ファイルのアップロードで書いたスクリプトは実は動かないことが多い。なぜなら、生のデータを出力しているのにもかかわらず、ヘッダーが指定されていない。画像などを出力する場合、header()関数で、
header("Content-type: image/jpeg");
としてやればjpgファイルを正しく出力することができる。(下記修正スクリプト参照)
<?php //$uploadfileにアップロードしたファイルの場所と名前を記す $uploaddir = '/var/tmp/'; $uploadfile = $uploaddir. $_FILES['userfile']['name']; //アップロードしたファイルが存在する場合処理をする if(!is_uploaded_file($_FILES['userfile']['tmp_name'])) { echo "ファイルを保存できませんでした!"; exit; } else { //PHPが作ったテンポラリファイルを$uploadfileにコピーする copy($_FILES['userfile']['tmp_name'],$uploadfile); //ファイルの内容を$contentsに書き出す $UPLOAD = fopen($uploadfile,"r"); $contents = fread($UPLOAD,$_FILES['userfile']['size']); fclose($UPLOAD); header("Content-type: image/jpeg"); echo $contents; } ?>
- headerはその前に何も出力していないという条件がつくので、もし何か出力されていると、
Warning: Cannot modify header information - headers already sent by (output started a.....
などというエラーが出る。たとえば、先のスクリプトの最初の部分に何気なく改行をいれると、
(ここに改行) <?php //$uploadfileにアップロードしたファイルの場所と名前を記す $uploaddir =・・・
サーバーはその改行コードからまず出力しようとする。そうすると、phpのでフォルトで指定されているtext/htmlというタイプがヘッダーで送り出されるので(php.iniで変更も可)、上のスクリプトもエラーとなる。下は参考。
Content-type: text/html … HTML Content-type: text/plain … プレインテキスト Content-type: image/gif … GIF 画像 Content-type: image/jpeg … JPEG 画像
readfile()関数 ↑
- PHPにはファイルを読んでそのまま標準出力に出してくれるという便利な関数がある。
<?php header("Content-type: image/jpeg"); // 読む・出力する readfile('test.jpg'); ?>
これだけでよい。きちんと画像が出力される。柔軟性に欠けるが。。
<img> タグを使う ↑
- 画像の表示1・2で使ったようにメモリからファイルを作っておいて、それを<img>タグで表示するのが簡単化もしれない。
<? imagejpeg($image,"image.jpg"); imagedestroy($image); ?> <img src = "image.jpg" border="0">
もちろんheader()の指定もしなくてよい。