HTMLのformでmultipartを使用
multipart/form-data は、フォームからファイルをアップロードする際に使用するエンコーディングタイプです。
通常の application/x-www-form-urlencoded では、ファイルを含むデータを正しく送信することができません。
そのため、ファイルアップロードが必要なフォームには multipart/form-data を指定する必要があります。
以下に、multipart/form-data を使用したフォームのHTMLと、ファイルアップロードを処理する基本的なサーバーサイドスクリプトの例を示します。
HTMLファイル (test-form.html)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ファイルアップロードフォーム</title> </head> <body> <h1>ファイルアップロードフォーム</h1> <form action="test-upload.php" method="post" enctype="multipart/form-data"> <label for="test-file">ファイルを選択:</label> <input type="file" id="test-file" name="test-file" required> <br> <input type="submit" value="アップロード"> </form> </body> </html>
PHPサーバースクリプト (test-upload.php)
<?php // ファイルがアップロードされたかチェック if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (isset($_FILES['test-file']) && $_FILES['test-file']['error'] == UPLOAD_ERR_OK) { $fileTmpPath = $_FILES['test-file']['tmp_name']; $fileName = $_FILES['test-file']['name']; $fileSize = $_FILES['test-file']['size']; $fileType = $_FILES['test-file']['type']; $uploadDir = 'uploads/'; // アップロードディレクトリが存在しない場合は作成 if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } // ファイルをアップロードディレクトリに移動 $destFilePath = $uploadDir . $fileName; if (move_uploaded_file($fileTmpPath, $destFilePath)) { echo 'ファイルのアップロードに成功しました。'; } else { echo 'ファイルのアップロードに失敗しました。'; } } else { echo 'ファイルがアップロードされていないか、エラーが発生しました。'; } } else { echo '無効なリクエストです。'; } ?>
解説
1. HTMLフォーム
- form タグの enctype 属性に multipart/form-data を設定することで、ファイルを含むデータを正しく送信するためのエンコーディングが指定されます。
- input タグの type 属性に file を指定すると、ユーザーがファイルを選択するためのファイル選択ボタンが表示されます。
2. PHPスクリプト
- $_FILES スーパーグローバル変数を使用して、アップロードされたファイルの情報を取得します。
- move_uploaded_file 関数を使用して、ファイルを指定されたディレクトリに移動します。
成功すると、ファイルのパスが返されます。
ファイルアップロード機能を安全に運用するためには、アップロードファイルの検証やサイズ制限、セキュリティ対策が重要です。
また、uploads/ ディレクトリは適切にアクセス制限を設け、外部からの直接アクセスを防ぐべきです。