PHPでファイルをアップロードする

PHP

今回はPHPでファイルをアップロードする方法を紹介します。

ファイルアップロードの説明

$_FILESについて

グローバルの$_FILESには、アップロードされたファイルの情報が含まれます。

php.ini の upload_tmp_dir ディレクティブで 他の場所を指定しない限り、ファイルはサーバーにおけるデフォルトの テンポラリディレクトリに保存されます。

$_FILES[‘userfile’][‘name’] クライアントマシンの元のファイル名
$_FILES[‘userfile’][‘type’] ファイルの MIME 型,ブラウザがこの情報を提供する場合、この値は信用できません。
$_FILES[‘userfile’][‘size’] アップロードされたファイルのバイト単位のサイズ
$_FILES[‘userfile’][‘tmp_name’] アップロードされたファイルがサーバー上で保存されているテンポラ リファイルの名前
$_FILES[‘userfile’][‘error’] このファイルアップロードに関する エラーコード

errorについて

UPLOAD_ERR_OK 値: 0; エラーはなく、ファイルアップロードは成功しています
UPLOAD_ERR_INI_SIZE 値: 1; アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています
UPLOAD_ERR_FORM_SIZE 値: 2; アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています
UPLOAD_ERR_PARTIAL 値: 3; アップロードされたファイルは一部のみしかアップロードされていません
UPLOAD_ERR_NO_FILE 値: 4; ファイルはアップロードされませんでした
UPLOAD_ERR_NO_TMP_DIR 値: 6; テンポラリフォルダがありません
UPLOAD_ERR_CANT_WRITE 値: 7; ディスクへの書き込みに失敗しました
UPLOAD_ERR_EXTENSION 値: 8; PHPの拡張モジュールがファイルのアップロードを中止しました

ファイルタイプ確認

アップロードされたファイルのタイプを確認する方法も複数が存在しますが、今回はFileinfo拡張モジュールでチェックする

ファイルアップロードのコード

<!DOCTYPE html>
<html lang=”ja”>
<head></head>
<body>
<?php
// アップロードファイルのチェック
function file_check($file) {
    if ($file[‘error’] != UPLOAD_ERR_OK) {
      switch ($file[‘error’]) {
        case UPLOAD_ERR_INI_SIZE:
          return “アップロードされたファイルは、upload_max_filesizeディレクティブの値(“.
ini_get(‘upload_max_filesize’).”)を超えています”;
        case UPLOAD_ERR_FORM_SIZE:
          return “アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています”;
        case UPLOAD_ERR_PARTIAL:
          return “アップロードされたファイルは一部のみしかアップロードされていません”;
        case UPLOAD_ERR_NO_FILE:
          return “ファイルはアップロードされませんでした”;
        case UPLOAD_ERR_NO_TMP_DIR:
          return “テンポラリフォルダがありません”;
        case UPLOAD_ERR_CANT_WRITE:
          return “ディスクへの書き込みに失敗しました”;
        case UPLOAD_ERR_EXTENSION:
          return “PHPの拡張モジュールがファイルのアップロードを中止しました”;
        default:
          return “未知エラー”;
      }
    }

    // ファイルタイプチェック
    $f_info = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($f_info, $file[‘tmp_name’]);
    $allow_mime = [‘image/jpeg’,’image/png’,’image/gif’];

    if (!in_array($mime, $allow_mime)) {
      return “ファイルタイプ不正”;
    }

    // ファイルサイズチェック
    $allow_size = 30720;
    if ($file[‘size’] > $allow_size) {
      return “ファイルサイズを超えました。最大:”.number_format($allow_size/1024,1).”K”;
    }

    // http経由でアップロード
    if(!is_uploaded_file($file[‘tmp_name’]))
      return “http経由でアップロードしてください。”;

    return null;
}
if (!empty($_POST)) {
    // チェックエラーの場合
    if ($err_msg = file_check($_FILES[‘img_pic’])) {
      echo $err_msg;
    } else {
        //正常の場合
      $folder_name=date(‘Y-m-d’);
      $folder_path=”./uploads/{$folder_name}”;

      if (!is_dir($folder_path))
        mkdir($folder_path);
      $file_name=uniqid(‘img’,true).strrchr($_FILES[‘img_pic’][‘name’],’.’);
      $file_path=”{$folder_path}/{$file_name}”;

      if (move_uploaded_file($_FILES[‘img_pic’][‘tmp_name’], $file_path))
        echo “upload success”;
      else
        echo “upload error”;
    }
}
?>
<form method=”post” action=”” enctype=”multipart/form-data”>
<input type=”file” name=”img_pic”>
<input type=”submit” name=”button” value=”COMMIT”>
</body>
</html>

タイトルとURLをコピーしました