🌊
【初心者向け】フォームを利用したファイルアップロードの実装
概要
この記事では、フォームで選択したファイルをサーバーへアップロードする機能を実装する方法を解説します。
PHPの公式ページにあるものを参考にしているので、とてもシンプルなものになっています。
フォームの操作イメージ
参考サイト
- [PHP公式]ファイルの送信方法に関するhtmlとphpの書き方を参考にしました。
https://www.php.net/manual/ja/features.file-upload.post-method.php - [PHP公式]ファイル送信をした後のエラー番号に関する情報が記載されています。
https://www.php.net/manual/ja/features.file-upload.errors.php
利用イメージ
- ゲーム等でユーザーがローカルに持っている画像ファイルを利用できる様にする
- 企業の社内システムで書類のアップロードによるファイル共有機能を利用できる様にする
コード
FileUpload
├ upload
├ index.html
└ send.php
index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>FileUploader</title>
</head>
<body>
<!-- データのエンコード方式である enctype は、必ず以下のようにしなければなりません -->
<form enctype="multipart/form-data" action="send.php" method="POST">
<!-- MAX_FILE_SIZE は、必ず "file" input フィールドより前になければなりません -->
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" />
<!-- input 要素の name 属性の値が、$_FILES 配列のキーになります -->
このファイルをアップロード: <input name="userfile" type="file" />
<input type="submit" value="ファイルを送信" />
</form>
</body>
</html>
send.php
<?php
//実際に存在するフォルダ名を指定しなければエラーになります。
//send.phpファイルからの相対Path
$uploaddir = './upload/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "<p>ファイルの送信に成功しました。</p>";
} else {
echo "<p>ファイルの送信に失敗しました。</p>";
}
echo 'デバッグ情報:';
print_r($_FILES);
echo "</pre>";
?>
解説
- index.htmlに記述している
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" />
で送信可能な最大ファイルサイズを指定しています。
ここでは、2MB = 2 * 1,024 * 1,024 = 2,097,152 byteで計算しています。 - send.phpに記述している
$uploaddir
で指定したサーバー側のフォルダに、アップロードしたファイルが保存されていきます。 - ファイル送信に成功/失敗した時のメッセージが公式のままだと分かりづらかった為、日本語表記に変更しています。
応用 - bootstrap
bootstrapを使って、以下の様なフォームになります。
bootstrap.html
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<title>FileUploader</title>
</head>
<body>
<div class="container">
<!-- データのエンコード方式である enctype は、必ず以下のようにしなければなりません -->
<form class="m-3" enctype="multipart/form-data" action="send.php" method="POST">
<!-- MAX_FILE_SIZE は、必ず "file" input フィールドより前になければなりません -->
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<!-- input 要素の name 属性の値が、$_FILES 配列のキーになります -->
<div class="d-flex mb-3">
<input class="form-control me-3" name="userfile" type="file" id="formFile">
<input class="btn btn-success" type="submit" value="送信">
</div>
</form>
</div>
</body>
</html>
Discussion