You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP视频上传代码500 HTTP错误排查求助(Docker+MySQL环境)

排查PHP视频上传系统的500 HTTP错误(新手友好指南)

嘿,我刚仔细看了你的代码和问题描述,作为过来人特别理解这种项目卡壳的焦虑!先别慌,500错误大多是代码里的语法问题或者逻辑漏洞,咱们一步步揪出问题:

一、最直接的语法/变量错误(触发500的核心原因)

  • 变量名拼写不一致:你定义的文件类型变量是$videosFileType,但后面判断格式时写成了$videoFileType(少了个s),未定义的变量会直接导致PHP报错。
  • 表单字段名不匹配:HTML里文件输入框的name是archivo a subir,但PHP里却用$_FILES["fileToUpload"]获取数据——表单提交后PHP根本拿不到文件,这必然引发错误。
  • SQL语句的引号嵌套错误:你的插入语句里'$_FILES["fileToUpload"]["name"]'写法不符合PHP语法,字符串里嵌套双引号会解析失败,而且还存在严重的SQL注入风险。
  • 多余的注释符号:代码最后一行mysqli_close($conn);*/多了个*/,属于语法错误,直接导致PHP解析中断。
  • 赋值运算符用错:你写的$uploadFinal == 1;是比较操作,不是赋值,应该改成$uploadFinal = 1;,否则$uploadFinal的值永远是初始的1,逻辑完全混乱。

二、逻辑上的小漏洞

  • 错误的文件类型检测:getvideosize()?应该是getimagesize()吧?但这个函数是用来检测图片的,视频文件会返回false,直接触发“不是视频”的错误,建议换成MIME类型检测或者直接靠后缀判断。
  • 文件大小限制太严格:2000000字节才2MB,视频文件基本都超过这个大小,建议调大一点(比如200000000就是200MB)。

修正后的完整代码

<?php
// 开启错误显示,方便调试(上线后记得关掉)
error_reporting(E_ALL);
ini_set('display_errors', 1);

$target_dir = "./videosSubidos/";
// 确保文件夹存在,没有就创建
if (!file_exists($target_dir)) {
    mkdir($target_dir, 0755, true);
}
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$uploadFinal = 1;
$videosFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

if (isset($_POST["submit"])) {
    // 替换成视频MIME类型检测更准确
    $allowedMimeTypes = ["video/mp4", "video/mov", "video/mkv", "video/ogg", "video/flv", "video/mpeg", "video/avi", "video/wmv", "video/webm"];
    $fileMimeType = mime_content_type($_FILES["fileToUpload"]["tmp_name"]);
    if (in_array($fileMimeType, $allowedMimeTypes)) {
        echo "El archivo es un video- " . $fileMimeType . ".";
        $uploadOk = 1;
    } else {
        echo "El archivo no es un video.";
        $uploadOk = 0;
    }

    // 检查文件是否已存在
    if (file_exists($target_file)) {
        echo "Lo sentimos, ese video ya existe.";
        $uploadOk = 0;
    }

    // 检查文件大小(调整为200MB)
    if ($_FILES["fileToUpload"]["size"] > 200000000) {
        echo "El vídeo es demasiado grande.";
        $uploadOk = 0;
    }

    // 允许的文件格式
    $allowedExtensions = ["mov", "mp4", "mkv", "ogg", "flv", "mpeg", "avi", "wmv", "webm"];
    if (!in_array($videosFileType, $allowedExtensions)) {
        echo "Lo siento, esa extensión no está dentro de las permitidas";
        $uploadOk = 0;
    }

    if ($uploadOk == 0) {
        echo "Lo sentimos, el video no fue subido.";
    } else {
        if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "El video ". basename($_FILES["fileToUpload"]["name"]). " se ha subido.";
            $uploadFinal = 1;
        } else {
            echo "Lo sentimos, ha habido un error subiendo tu video.";
            $uploadFinal = 0;
        }
    }

    if ($uploadFinal == 1) {
        echo "Realizando conexión con base de datos";
        $conn = new mysqli("10.0.2.15", "root", "sarapo", "videos");
        if (!$conn) {
            die("Fallo en la conexión: " . mysqli_connect_error());
        }
        echo "Conexión exitosa";

        // 使用预处理语句防止SQL注入
        $stmt = $conn->prepare("INSERT INTO subir (nombre, tipo) VALUES (?, ?)");
        $stmt->bind_param("ss", $_FILES["fileToUpload"]["name"], $videosFileType);
        $stmt->execute();
        $stmt->close();

        mysqli_close($conn);
    }
}
?>
<!DOCTYPE html>
<html>
<body>
<form action ="<?php echo $_SERVER['PHP_SELF']?>" method="post" enctype='multipart/form-data'>
Select video to upload:<br><br>
<input type="file" name="fileToUpload" id="fileToUpload"><br><br>
<input type="submit" value="Subir" name="submit"><br><br>
</form>
</body>
</html>

额外调试建议

  1. 开启错误显示:我在修正后的代码开头加了错误显示的代码,这样能直接在页面上看到具体的错误信息,不用再猜500的原因。
  2. 检查文件夹权限:确保videosSubidos文件夹的权限是755,让PHP有写入权限(Docker环境里可能需要调整容器内的文件夹权限)。
  3. 测试MySQL连接:可以单独写一个小脚本测试MySQL连接是否正常,排除环境问题。

内容的提问来源于stack exchange,提问作者sxrisw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:02:50