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>
额外调试建议
- 开启错误显示:我在修正后的代码开头加了错误显示的代码,这样能直接在页面上看到具体的错误信息,不用再猜500的原因。
- 检查文件夹权限:确保
videosSubidos文件夹的权限是755,让PHP有写入权限(Docker环境里可能需要调整容器内的文件夹权限)。 - 测试MySQL连接:可以单独写一个小脚本测试MySQL连接是否正常,排除环境问题。
内容的提问来源于stack exchange,提问作者sxrisw
相关产品推荐
相关产品推荐

