■What's
さて、前回は画像をサーバー内にアップロードするまで行いました。今回はそのデータにファイル名をつけて、その画像を表示するためファイルまでパスを前回作った、data.txtに書き込んでみましょう。今回は自作関数を作っちゃいますYO
■サンプルプログラム
テキストエディタに以下のように書き込んで、「lesson11」フォルダの中に「sample02.php」として保存しましょう。
<?php
$img_tmp = $_FILES["img_path"]["tmp_name"];
$img_name = $_FILES["img_path"]["name"];
$img_size = $_FILES["img_path"]["size"];
if($_REQUEST["up"] != ""){
if($img_tmp != "" and $img_size <= 30000){
$img_message = "名前は: $img_name <br>サイズは: $img_size <br>MIMEタイプは: $img_type <br>一時的に保存されているパスは: $img_tmp <br>";
$FilePath = "./img/".date("Ymdhis").".".GetExt($img_name);
move_uploaded_file($img_tmp,$FilePath);
$fp = fopen("./img/data.txt","a");
fputs($fp,$FilePath."\n");
fclose($fp);
}else{
$size_error = "サイズが大きすぎます。ファイルサイズは30キロバイト以下です。";
}
}
// GetExt
// ファイルの拡張子を取得します。
function GetExt($FilePath){
$f=strrev($FilePath);
$ext=substr($f,0,strpos($f,"."));
return strrev($ext);
}
?><html>
<head>
<title>画像アップロード</title>
</head>
<body>
<h1>画像アップロード</h1>
<font color="#FF0000"><strong><?= $size_error ?></strong></font><?= $img_message ?>
<form name="form" action="<?php print $_SERVER['PHP_SELF']; ?>" method="POST"
ENCTYPE="MULTIPART/FORM-DATA">
<input name="img_path" type="file" size="40">
<input name="up" type="submit" value="アップロード"><hr>
<table border="0">
<tr>
<?php
$array_img = file("./img/data.txt");
for($i=0; $i<sizeof($array_img); $i++){
$array_img[$i] = ereg_replace("\n","",$array_img[$i]);
print "<td style=\"border:1px solid #000000\"><img src=\"$array_img[$i]\" width=\"100\" height=\"100\"></td>";
}
?>
</tr>
</table>
</form>
</body>
</html>
できましたら、ブラウザのアドレスに
「http://localhost/lesson11/sample02.php」と入力してアクセス!!
ロリポップ!
さくらのレンタルサーバ
などのレンタルサーバー使ってる方はlocalhostのところはドメイン名になります。
(簡単に安くネットショップを開きたい方はこちら!)
さて、如何でしょうか?ちゃんと表示されましたでしょうか?
■解説
え〜っとまず、ここからイキマスカネ。
// GetExt
// ファイルの拡張子を取得します。
function GetExt($FilePath){
$f=strrev($FilePath);
$ext=substr($f,0,strpos($f,"."));
return strrev($ext);
}
これ自作関数です。ナニをしてるかと言うと、アップロードされた拡張子を取得しています。自作関数についてわからない人もいるかもしれないので、まず関数を作るにはfunction 関数名(){}といった形になります。()の中には引数が入ります。そして{}の中に処理を書いていきます。今回は、GetExtという名前をつけて引数には$FilePathというのを受け取ります。今回は画像までのパスがを与えてやります。さて中身の解説ですが、
$f=strrev($FilePath);
strrev()関数ですが、これは引数の中も文字列を逆順にします。例えば、「img001.jpg」というのがあったとすると、「gpj.100gmi」となるわけデスナ。それを$fに格納しています。さて次。
$ext=substr($f,0,strpos($f,"."));
substr(文字列,開始位置,文字列の長さ)この関数は文字列の一部分を返します。例えば、substr("abcdefg",1,3)だとすると返す文字列は「bcd」となるわけです。今回は文字列の長さのところに更に関数が入ってますね。こうやって関数の中にさらに関数を入れることも可能です。
strpos($f,".")
さてこの関数ですが、strpos(文字列,検索文字)となっており、検索文字の位置を返します。例えば、strpos("abcdef","e")この場合返す値は「4」となります。0から数えはじめることに注意!
$ext=substr($f,0,strpos($f,"."));
こいつはもう解読できますよね?$fが「gpj.100gmi」として考えましょう。まずはstrpos("gpj.100gmi",".")で返す数値がドットがでてくるところですから、「3」となりますね。substr("gpj.100gmi",0,3)となりますので、返す文字列は「gpj」となるわけです。ドットがは入りません。第3引数で長さ3文字となっているからです。これで拡張子が取得できました。これでしたら、「jpeg」という文字数が違う拡張子でも取得できるわけですね。
最後に!この自作関数のままでは値を書いてないので、実際には自分だけで処理して終了。という感じになってしまっています。処理はちゃんとしているんですよ。それを返さないといけないので「return」というのを使います。それと、「gpj」となっていますのでこれを反転させるため
return strrev($ext);
strrev(文字列)というのを使っています。これは初めのほうに使いましたね。それをreturnで返しています。とりあえず、拡張子が取得できればやり方はなんでもOKです。
$FilePath = "./img/".date("Ymdhis").".".GetExt($img_name);
さて、こちら。画像がアップロードされたファイル名を決めています。imgというフォルダ名でアップロードした年月日時間分秒ドット拡張子という感じで命名しているわけですね。これを$FilePathに格納しています。
move_uploaded_file($img_tmp,$FilePath);
さて、こちら!アップロードされたファイルはまだtmpフォルダ(一時保存フォルダ)というところに格納されるわけで、それを別のところへ保存しないといけないわけなのです。そこで便利な関数が、move_uploaded_file("ファイル名","移動先")です。$img_tmpはアップロードされた一時場所を指定しました。$FilePathは先ほど指定しました。これで$img_tmp→$FilePathへ移動されるわけです。その後、画像を表示するため画像へのパスを書き込んでいます。これは前のレッスンなどでやっているので割愛します。
さて、最後に出力です。
$array_img = file("./img/data.txt");
これも前回でてきました。file()関数で1行ずつ書かれた文字列を配列に格納していきます。表示するときはforでループさせてガンガン表示させていきます。
さてさて、如何だったでしょうか?ちょっと難しい点が多かったかもしれませんが、何度か読んでいけば絶対できるはずです!アップロードされた画像のファイル名とか見ると!おぉ!凄い!なんておもっちゃうかもしれません。ハイ。あと考えないといけないことはウィルスなんかを送ってくれる人対策。jpg,bmp,jpeg以外はアップロードさせない。ってのも必要になってくるんですかね。それでも完全には防げないでしょうね。あとはIP記録しておくのもいいかもしれませんね。まぁ、そういう人がいませんように。うへへ。