← 完成版とシステムの改良へ戻る / ソース一覧へ

lesson_answer_upload.php

このページはソースコードを表示するためのHTMLです。source_common/lesson_answer_upload.php への直接リンクではないため,PHPスクリプトは実行されません。
<?php
// lesson_answer_upload.php: 練習問題解答例
session_start();
require_once __DIR__ . '/common/common.php';
$member = login_check();

$allowed_ext = ['pdf', 'zip', 'txt'];
$error = '';

if (!empty($_FILES['task_file']['name'])) {
    $original = basename($_FILES['task_file']['name']);
    $ext = strtolower(pathinfo($original, PATHINFO_EXTENSION));

    if (!in_array($ext, $allowed_ext, true)) {
        $error = 'アップロードできるファイルは pdf, zip, txt のみです。';
    } else {
        $save_name = date('YmdHis') . '_' . bin2hex(random_bytes(4)) . '.' . $ext;
        move_uploaded_file($_FILES['task_file']['tmp_name'], __DIR__ . '/task_folder/' . $save_name);

        $sql = 'INSERT INTO task (member, name, file, change_name, word, modified) VALUES (:member, :name, :file, :change_name, :word, NOW())';
        $stmt = $dbh->prepare($sql);
        $stmt->bindValue(':member', (int)$member['id'], PDO::PARAM_INT);
        $stmt->bindValue(':name', $_POST['name'], PDO::PARAM_STR);
        $stmt->bindValue(':file', $original, PDO::PARAM_STR);
        $stmt->bindValue(':change_name', $save_name, PDO::PARAM_STR);
        $stmt->bindValue(':word', $_POST['word'] ?? '', PDO::PARAM_STR);
        $stmt->execute();

        header('Location: task_list.php');
        exit();
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>課題提出</title></head>
<body>
<h1>課題提出</h1>
<?php if ($error !== ''): ?><p style="color:red"><?php echo h($error); ?></p><?php endif; ?>
<form action="" method="post" enctype="multipart/form-data">
    <p>課題名:<input type="text" name="name" required></p>
    <p>提出ファイル:<input type="file" id="task_file" name="task_file" required></p>
    <p id="file_info"></p>
    <p>コメント:<textarea name="word" rows="5" cols="50"></textarea></p>
    <p><input type="submit" value="提出"></p>
</form>
<script>
document.getElementById('task_file').addEventListener('change', function () {
    const file = this.files[0];
    if (!file) return;
    const allowed = ['pdf', 'zip', 'txt'];
    const ext = file.name.split('.').pop().toLowerCase();
    document.getElementById('file_info').textContent = `${file.name} (${file.size} bytes)`;
    if (!allowed.includes(ext)) {
        alert('アップロードできるファイルは pdf, zip, txt のみです。');
        this.value = '';
        document.getElementById('file_info').textContent = '';
    }
});
</script>
</body>
</html>

Copyright (c) 2014-2026 T.Kouya Laboratory @ Otemon Gakuin University. All rights reserved.