投稿のアップロード

■投稿のアップロード

今度は画像をアップロードするプログラムです。g.php(画像とメッセージ一覧画面)の「アップロード」のリンクをすると表示されます。g_up.phpがアップロードのためのフォーム、g_up_set.phpがそれを受け取って処理するプログラムです。

g_up.php

<?php
session_start();
?>

<HTML>
<HEAD>
<META HTTP EQUIV='Content-Type' CONTENT='text/html;charset=UTF=8'>
<TITLE>ようこそABC写真へ!</TITLE>
</HEAD>
<BODY>
<P STYLE='color: red'>ABC写真</p>

<?php
if(isset($_SESSION['us']) && $_SESSION['us']!=null){                                     ①
?>

<P>投稿内容</P>                        


<FORM ENCTYPE = 'multipart/form-data' ACTION ='g_up_set.php' METHOD ='post'>名前<BR>                                  ③~
<INPUT TYPE='text' NAME='myn'><BR>メッセージ<BR>
<TEXTAREA NAME='mym' ROWS='10' COLS='70'></TEXTAREA><BR>
<INPUT TYPE='file' NAME='myf'>
<INPUT TYPE='submit' VALUE='送信'>                                                   ~③
</FORM>
<P><A HREF='g.php'>一覧表示へ</A></P>

<?php
}else{
   session_destroy();
   print "<P>ログインしてください!<BR>
            <A HREF=g_login.html'>ログイン</A></P>";
}
?>
</BODY>
</HTML>

①セッションの継続者かどうかをチェック

②<FORM ENCTYPE='multpart/form-data' ~>

フォームでファイルをアップロードする場合に使用する

③「データを識別する名前」

・「名前」を入力するテキストボックス「myn」

・メッセージが「mym」

・アップロードする画像ファイル名が「myf」

■送信した内容を受ける

「g_up.php」で送信した内容を受けるのが、次のg_up_set.phpです。アップロードされた画像のサムネイルを作ったり、データを保管したりします。

g_up_set.php

<?php
session_start();                            
?>

<HTML>
<HEAD>
<META HTTP EQUIV='Content-Type' CONTENT='text/html;charset=UTF=8'>
<TITLE>ようこそABC写真へ!</TITLE>
</HEAD>
<BODY>

<?php
if(isset($_SESSION["us"]) && $_SESSION["us"]!=null){          ①~
$file = &_FILES['mym'];                       ~①

                                                                                                                            ②~

if($_POST['myn']<>""&& $_POST['myn']<>""&& $file['size']>0&&   ($file['type']=='image/jpeg'||$file['type']=='image/pjpeg')&&(strtolower(mb_strrchr($file['name'],'.'FALSE))==".jpg")){                                ~②
if($file['size']>1024*1024){                       ③
unlink($file['tmp_name']);
?>
<P><A HREF='g_up.php'>アップロード画面に戻る</A></P>         ④

<?php
}else{
//アップロードされた画像ファイルを移動                ⑤~
$ima =date('YmdHis');
$fn =$ima.$file['name'];
move_uploaded_file($file['tmp_name'],'./gz_img/'.$fn);            ~⑤

$my_nam =htmlspecialchars($_POST['myn'],ENT_QUOTES);                          ⑥~
$my_mes =htmlspecialchars($_POST['mym'],ENT_QUOTES);                      ~⑥

//サムネイルの作成
$mgz=imagecreatefromjpeg("./gz_img/$fn");               ⑦
list($w,$h)=getimagesize("./gz_img/$fn");                                                           ⑧
$new_h=200;
$new_w=$w*200/$h;
$mythmb=imagecreatetruecolor($new_w,$new_h);            ⑨
imagecopyresized($mythumb,$mgz,0,0,0,0,$new_w,$new_h,$w,$h);               ⑩
imagejpeg($mythumb,"./gz_img/thumb_$fn");                ⑪

//サムネイルの表示
print "<P>".$file['name']."のアップロードに成功!<BR>
<IMG SRC='./gz_img/thumb_$fn'></p>";                  ⑫

//データベースに追加
require_once("db_init.php");                                                                               ⑬
                                                                                                                            ⑭~ 
$ps =$db->prepare("INSERT INTO  table1(nam,mes,ope,gaz,dat)VALUES(:v_n:v_m,1,:v_g,:v_d)");
$ps->bindParam(':v_n',$my_nam);
$ps->bindParam(':v_m',$my_mes);
$ps->bindParam(':v_g',$fn);
$ps->bindParam(':v_d',$ima);
$ps->execute();                           ~⑭
print"<A HREF=g.php>一覧表示へ</A>";
}
}else{
?>
<P>名前とメッセージを入力しJPEGファイルを選択してください<BR>
<A HREF='g_up.php'>再度アップロード</A></P>
<?php
}
}else{
session_destroy();
print"<P>ログインしてください!<BR>
<A HREF='g_login.html'>ログイン</A></P>";
}
?>
</BODY>
</HTML>

①セッションの継続者かチェックを行い、アップロードされたファイルの情報を「$file」に代入。

jpegファイルかどうかのチェック

・入力してきた「名前」と「メッセージ」が空ではないか(入力されているか)

if($_POST['myn']<>""&& $_POST['myn']<>""

・「ファイルのサイズが0より大きい」か

&& $file['size']>0

・mb_strrchr関数(FALSEなので、指定した文字列の最後まで絞る)で、ファイル名の途中にある「.」からの拡張子を指定し、「.JPG」か「.jpg」になっているかを判断し、大文字「.JPG」はstrtolowerで文字列を小文字にして「.jpg」かどうかチェック

&&(strtolower(mb_strrchr($file['name'],'.'FALSE))==".jpg")){ 

③ファイルサイズのチェック

アップロードされた画像ファイルが1MBを超える処理を実行しない設定にする。

TRUEの場合、アップロードされたファイルを削除

if($file['size']>1024*1024){

④メッセージを表示しフォーム画面に戻ることを促す。

⑤年月日時分秒を$imaに代入し、画像ファイル名と$imaを結合したものとして、変数$fnに代入。送信してきた一時ファイル($file['tmp_name']を「gz_img」ディレクトリに、新たな名前('./gz_img/',$fn)にして保存する。

⑥名前とメッセージの文字列の、タグをエスケープ

⑦imagecreatefromjpegで画像IDを取得し、$mgzに代入

⑧getimagesizeで画像の大きさを配列で取得し、list関数に(画像の幅[0],画像の高さ[1])変数$wと変数$hに入れる。

⑨サムネイル用画像リソースを新規に作成し、この「画像ID」を$mythmbに代入。

⑩先ほどサムネイル用で作成した「$mythumb」を、元の画像ID「$mgz」のサイズを変更してコピーする

⑪imagejpegで新規に作成したサムネイル画像$mythumb(画像ID)で、ファイルの先頭に「thumb_」を付けたファイル名で「gz_img」ディレクトリに保存。

⑫サムネイル画像の表示

⑬データベース接続

⑭テーブル「table1」への登録

プリペアステートメントを使って、アップロード情報をテーブル「table1」に挿入します。「table1」の各カラムにそれぞれのプレースホルダを用意し、bindParamでバインドしてexecuteでクエリを実行します。

「実行結果」

f:id:mkyosuke:20191211183713p:plain

 「ファイルを選択」

f:id:mkyosuke:20191211183919p:plain

「送信」ボタンをクリック

f:id:mkyosuke:20191211184439p:plain

「一覧表示へ」

f:id:mkyosuke:20191211184636p:plain

データベース

f:id:mkyosuke:20191211184918p:plain

画像ファイル

f:id:mkyosuke:20191211185248p:plain