WebプログラミングU PHP

 目次へ 前へ 次へ

2011/9/13 久米

 

4 掲示板作成 オプション

4.5 画像ファイルアップロード

ファイルアップロードの処理

スクリプト作成

  1. テーブルbbsに 列名img データ型VARCHAR(32) で NULLがOKの列を追加。
  2. board.phpのあるフォルダ内に、新規フォルダuploadを作成。画像ファイル用フォルダです。
  3. board.phpのあるフォルダ内に、img_file_name.phpを格納。画像ファイル名を教えてくれる関数が入っている。

 

board.phpの変更

<?php
・・・
require_once("img_file_name.php");  
・・・
if(isset($_POST['sub'])){ ・・・ $img=img_file_name();//$imgは画像ファイル名である $sql="INSERT INTO bbs2 (name, message, regidate, なにか記述) VALUES ('$name', '$message', now(), なにか記述)"; ・・・ } ・・・ while($row=mysqli_fetch_array($rst)){ ・・・ if($row['img']!=null){ $body.="<p><img src='upload/".$row['img']."'></p>"; } } ・・・ ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>掲示板</title> </head> <body> <h1>掲示板</h1> <form name="f" method="post" action="<?php print $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data"> 名前:<input type="text" name="name"> <input type="submit" name="sub" value="投稿"><br> <textarea name="message" cols="80" rows="10"></textarea><br> 画像(GIF/JPEG形式100kB以下):<input type="file" name="uploadfile" size="40"> </form> <hr> <?php print $body; ?> </body> </html>

 

img_file_name.php

サーバに保存した画像ファイル名を教えてくれる関数

<?php
//ファイルアップロード用関数
//使用例 $img=img_file_name();
function img_file_name(){//$fはフォーム投稿した時のinputタグ名。$dは保存するディレクトリ名
    $f="uploadfile";
    $d="upload/";
    $img="";//アップロードしたファイルのサーバ側でのファイル名が入る。
    
    //以下のif文は、アップロードのファイルが無い場合、空文字をreturnしている。
    if($_FILES[$f]['name']=="") return $img;
    
    //拡張子の決定
    $ext="";
    if($_FILES[$f]['type']=="image/gif") $ext="gif";
    else if($_FILES[$f]['type']=="image/pjpeg" || $_FILES[$f]['type']=="image/jpeg") $ext="jpg";
    
    if($ext==""){
        exit("GIF/JPEG形式以外の画像ファイルは登録できません。");
    }else {
        $imgname=date("Ymd-His")."-".rand(1000,9999).".".$ext;//重複名にならないように現在時刻から命名
        if(move_uploaded_file($_FILES[$f]['tmp_name'], $d.$imgname)){
            $img=$imgname;
        }else{
            exit("画像ファイルのアップロードに失敗しました。");
        }
    }
    return $img;
}
?>

 

参考)
header( 'Content-type: text/html; charset=UTF-8' );
exit("保守中です。しばらくしてから投稿ください。");