<?php
/**
 * 文件上传 API 接口（供 Unity 调用）
 * 请求方式：POST
 * Content-Type: multipart/form-data
 * 参数：file - 要上传的文件
 * 响应格式：JSON
 */

// 1. 跨域支持（允许 Unity 客户端访问）
header("Access-Control-Allow-Origin: *"); // 开发环境通配，生产环境可指定 Unity 服务器地址
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json; charset=utf-8"); // 固定返回 JSON

// 2. 配置项（和 upload.php 保持一致）
$uploadDir = __DIR__ . '/uploads/'; // 上传目录
$maxSize = 20 * 1024 * 1024; // 2MB
$allowedExts = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'txt']; // 允许的后缀

// 3. 统一响应函数
function sendResponse($code, $msg, $data = null) {
    $response = [
        'code' => $code, // 200=成功，400=参数错误，500=服务器错误，403=验证失败
        'msg' => $msg,
        'data' => $data
    ];
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit;
}

// 4. 检查请求方式
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    sendResponse(400, '仅支持 POST 请求');
}

// 5. 检查文件是否上传
if (empty($_FILES['file'])) {
    sendResponse(400, '未接收到上传文件，请检查参数名是否为 "file"');
}

$file = $_FILES['file'];
$error = $file['error'];

// 6. 检查上传错误
if ($error !== UPLOAD_ERR_OK) {
    $errorMsg = match ($error) {
        UPLOAD_ERR_INI_SIZE => '文件超过 php.ini 配置大小限制',
        UPLOAD_ERR_FORM_SIZE => '文件超过表单大小限制',
        UPLOAD_ERR_PARTIAL => '文件仅部分上传',
        UPLOAD_ERR_NO_FILE => '未选择上传文件',
        UPLOAD_ERR_NO_TMP_DIR => '服务器缺少临时目录',
        UPLOAD_ERR_CANT_WRITE => '文件写入失败',
        default => '未知上传错误：' . $error
    };
    sendResponse(403, $errorMsg);
}

// 7. 验证文件大小
if ($file['size'] > $maxSize) {
    sendResponse(403, '文件大小超过 ' . ($maxSize / 1024 / 1024) . 'MB 限制');
}

// 8. 验证文件后缀
$originalName = $file['name'];
$ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if (!in_array($ext, $allowedExts)) {
    sendResponse(403, '不允许的文件类型，仅支持：' . implode(',', $allowedExts));
}

// 9. 处理文件名（避免重复）
$newFileName = uniqid('file_', true) . '.' . $ext;
$savePath = $uploadDir . $newFileName;

// 10. 确保上传目录存在
if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}

// 11. 移动文件并返回结果
if (move_uploaded_file($file['tmp_name'], $savePath)) {
    // 返回成功数据（包含文件名、访问路径等）
    $data = [
        'original_name' => $originalName,
        'save_name' => $newFileName,
        'file_size' => $file['size'],
        'file_ext' => $ext,
        'download_url' => 'http://你的域名/download.php?file=' . $newFileName // 替换为你的实际域名
    ];
    sendResponse(200, '文件上传成功', $data);
} else {
    sendResponse(500, '文件保存失败，请检查 uploads 目录权限');
}
?>