← ファイルアップロード機能の改良へ戻る

task_ajax_upload.php

このページはソースコードを表示するためのものです。PHPスクリプトは実行されません。

<?php
// task_ajax_upload.php: Drag & Drop + Ajax用アップロード処理
session_start();
require_once __DIR__ . '/common/common.php';
$member = login_check();

header('Content-Type: application/json; charset=UTF-8');

function json_response(bool $ok, string $message): void
{
    echo json_encode(['ok' => $ok, 'message' => $message], JSON_UNESCAPED_UNICODE);
    exit();
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    json_response(false, '不正なリクエストです。');
}

if (empty($_POST['name'])) {
    json_response(false, '課題名を入力してください。');
}

if (!isset($_FILES['task_file']) || $_FILES['task_file']['error'] !== UPLOAD_ERR_OK) {
    json_response(false, 'ファイルが正しくアップロードされませんでした。');
}

$file = $_FILES['task_file'];
$max_size = 5 * 1024 * 1024;
$allowed_ext = ['pdf', 'zip', 'txt'];
$allowed_mime = [
    'application/pdf',
    'application/zip',
    'application/x-zip-compressed',
    'text/plain',
];

if ($file['size'] > $max_size) {
    json_response(false, 'ファイルサイズは5MB以下にしてください。');
}

$original = basename($file['name']);
$ext = strtolower(pathinfo($original, PATHINFO_EXTENSION));

if (!in_array($ext, $allowed_ext, true)) {
    json_response(false, 'アップロードできる拡張子は pdf, zip, txt のみです。');
}

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($file['tmp_name']);

if (!in_array($mime, $allowed_mime, true)) {
    json_response(false, '許可されていないファイル形式です。');
}

$upload_dir = __DIR__ . '/task_folder';
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0755, true);
}

$save_name = date('YmdHis') . '_' . bin2hex(random_bytes(4)) . '.' . $ext;
$save_path = $upload_dir . '/' . $save_name;

if (!move_uploaded_file($file['tmp_name'], $save_path)) {
    json_response(false, 'ファイルの保存に失敗しました。');
}

$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();

json_response(true, 'アップロードが完了しました。');