LoginSignup
2
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-18

画像をアップロードの流れ

  1. フォームからファイルを受け取り、バリデーションする。
  2. 問題がなければ、サーバーの一時フォルダに保管。
  3. move_uploaded_file()で一時フォルダから指定のパスに移動させ、保存。


画像ファイルを送るフォーム

index.php
<form action="upload.php" method="POST" enctype="multipart/form-data">
      <input name="image" type="file" accept="image/*">
      <input type="submit" value="送信">
</form>


フォームから画像ファイルを受け取る
グローバル変数「FILES」
$_FILES['upload']['tmp_name']はアップロードされたファイルの情報が格納されたグローバル変数です。

upload.php
image = $_FILES['image'];
imageValidate($article,$image);


画像のバリデーションし、ファイルを一時ファイルから指定ファイルへ移動。(DBに保存して完了)

function.php
public function imageValidate($article,$image){
    $result = false;

    $filename = basename($image['name']);
    $tmp_path = $image['tmp_name'];
    $file_err = $image['error'];
    $filesize = $image['size'];
    $upload_dir = '/path';
    $save_filename = date('Ymdhis') . $filename; //ファイル名に日付を入れて保存する
    $err_msg = array();
    $save_path = $upload_dir.$filename;

    //ファイルのバリデーション
    //ファイルサイズは1MB未満か確認
    if ($filesize > 1048576 || $file_err == 2) {
        array_push($err_msg, 'ファイルサイズは1MB未満です。')
     }

    //許可する拡張子を指定
    $allow_ext = array('jpg', 'jpeg','png');
    //ファイルの拡張子を取得
    $file_ext = pathinfo($filename, PATHINFO_EXTENSION);
    //配列の中にあるか確認
    if (!in_array(strtolower($file_ext), $allow_ext)) {
        array_push($err_msg, '指定の画像ファイルを添付して下さい');
     }
     //エラーがあればエラーメッセージを返す
    if (count($err_msg) === 0) {
        //ファイルはあるかどうか確認、あれば一時ファイルから指定のディレクトリに移動
        if (is_uploaded_file($tmp_path)) {
            if(move_uploaded_file($tmp_path,$upload_dir.$save_filename)){
                fileSave($$save_filename); //DBに保存する関数
            }else{
                array_push($err_msg, 'ファイルが保存されませんでした。');
         }else{
            array_push($err_msg, 'ファイルが選択されていません。');
         }
     }else{
         return $err_msg;
     }
    }


 FILES [ アップロードフォームのinput name値 ] [ アップロードされたファイル情報の項目 ]
最初の[]にはHTMLアップロードフォームのinput属性のname値が設定されます。
2番目の[]にはアップロードされたファイル情報の項目が入ります。
ちなみに$_FILESの中身は以下のような連想配列になっています。

Array(
[name] => memo.txt
[type] => text/plain
[tmp_name] => /var/tmp/php7UNOJY
[error] => 0
[size] => 45
)
項目 内容
name 元ファイル名
type ファイルタイプ
tmp_name サーバーに一時保管されたファイル名
error エラーコード
size ファイルのバイト数


エラーコードは0ならアップロード成功で、1〜4、6〜8は以下のようなエラーになります。

コード エラー定数 説明
0 UPLOAD_ERR_OK エラーなし
1 UPLOAD_ERR_INI_SIZE php.iniのupload_max_filesizeのサイズを超えている
2 UPLOAD_ERR_FORM_SIZE HTMLフォームで指定された MAX_FILE_SIZE を超えている
3 UPLOAD_ERR_PARTIAL 一部のみしかアップロードされていない
4 UPLOAD_ERR_NO_FILE アップロードされなかった
6 UPLOAD_ERR_NO_TMP_DIR サーバー一時保管フォルダがない
7 UPLOAD_ERR_CANT_WRITE ディスクへの書き込みに失敗
8 UPLOAD_ERR_EXTENSION PHPの拡張モジュールがアップロードを中止した

注意する

※下記のように記述していた場合にファイルが最大サイズを超えると、
$_FILESの['type']['tmp_name']は空で送られてしまう。

 <input type="hidden" name="MAX_FILE_SIZE" value="1048576">
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2