HTMLのformでmultipartを使用

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/ ディレクトリは適切にアクセス制限を設け、外部からの直接アクセスを防ぐべきです。