PHP上传文件至MySQL后文件为0字节问题求助
解决PHP上传文件到MySQL后文件大小为0字节的问题
我之前也踩过这个坑——查询明明返回成功,结果读出来的文件却是空的,大概率是文件内容没被正确读取或写入数据库。咱们一步步排查解决:
1. 先检查表单的enctype属性
这是最容易漏掉的关键点!如果你的上传表单没加enctype="multipart/form-data",服务器根本接收不到上传的文件,自然存进去的就是0字节。确保表单是这样写的:
<form method="POST" action="your-upload-script.php" enctype="multipart/form-data"> <!-- 其他表单字段 --> <input type="text" name="username" placeholder="姓名"> <input type="email" name="email" placeholder="邮箱"> <input type="file" name="uploaded_file"> <button type="submit">提交</button> </form>
2. 确认文件内容被正确读取
你需要从$_FILES数组里拿到临时文件路径,再用file_get_contents()读取内容。如果路径错了或者临时文件不存在,读出来的就是空字符串。补全你的代码逻辑:
<?php $name = $email = $linkedinurl = $message = ''; function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 先判断文件是否上传成功 if (isset($_FILES['uploaded_file']) && $_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK) { $tempFile = $_FILES['uploaded_file']['tmp_name']; // 读取文件内容,先检查读取是否成功 $fileContent = file_get_contents($tempFile); if ($fileContent === false) { die('无法读取上传的临时文件,请检查服务器权限'); } // 处理其他表单字段 $name = test_input($_POST['username']); $email = test_input($_POST['email']); $linkedinurl = test_input($_POST['linkedin']); $message = test_input($_POST['message']); // 接下来执行数据库写入操作 // ... } else { die('文件上传失败,错误码:' . $_FILES['uploaded_file']['error']); } } ?>
3. 数据库字段类型要匹配
存储文件内容的字段必须用二进制类型:
- 小文件(<64KB)用
BLOB - 中等文件(<16MB)用
MEDIUMBLOB - 大文件(<4GB)用
LONGBLOB
如果用了VARCHAR或TEXT类型,不仅可能截断内容,还可能导致空值存储。
4. 用预处理语句正确绑定二进制参数
直接拼接SQL语句既不安全也容易出错,用PDO或mysqli的预处理时,要确保二进制内容的参数绑定正确:
PDO示例:
// 假设$pdo是已连接的PDO实例 $sql = "INSERT INTO your_table (name, email, linkedin_url, message, file_content, file_name) VALUES (:name, :email, :linkedin, :message, :file, :filename)"; $stmt = $pdo->prepare($sql); // 绑定参数,注意文件内容要用PDO::PARAM_LOB类型 $stmt->bindParam(':name', $name); $stmt->bindParam(':email', $email); $stmt->bindParam(':linkedin', $linkedinurl); $stmt->bindParam(':message', $message); $stmt->bindParam(':file', $fileContent, PDO::PARAM_LOB); $stmt->bindParam(':filename', $_FILES['uploaded_file']['name']); if ($stmt->execute()) { echo '文件存储成功'; } else { print_r($stmt->errorInfo()); // 打印错误信息排查 }
mysqli示例:
// 假设$conn是已连接的mysqli实例 $sql = "INSERT INTO your_table (name, email, linkedin_url, message, file_content, file_name) VALUES (?, ?, ?, ?, ?, ?)"; $stmt = $conn->prepare($sql); // 绑定参数,二进制内容用'b'类型标识 $stmt->bind_param("sssssb", $name, $email, $linkedinurl, $message, $fileContent, $_FILES['uploaded_file']['name']); if ($stmt->execute()) { echo '文件存储成功'; } else { echo '错误信息:' . $stmt->error; }
5. 检查服务器上传配置
确认php.ini里的以下参数是否符合你的需求:
upload_max_filesize:单个文件最大上传大小post_max_size:POST请求总大小限制upload_tmp_dir:临时文件存储目录(确保有读写权限)
可以通过phpinfo()查看当前配置,必要时修改php.ini后重启服务器。
最后建议你在写入数据库前,先输出strlen($fileContent)确认文件内容长度不为0,这样就能快速定位是读取文件的问题还是写入数据库的问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

