使用PHP上传图片时文件大小为0的问题求助
问题分析
你的代码核心错误在于错误处理了上传的图片内容:
- 你用
base64_decode($filename)尝试写入文件,但$filename只是上传文件的名称,根本不是图片的base64编码内容,所以写入的是空数据,导致文件大小为0。 - 直接拼接SQL语句存在SQL注入风险,必须使用预处理语句。
- 上传路径未做合法性校验,可能引发路径遍历漏洞。
修正后的代码
<?php $con = mysqli_connect($host_name, $user_name, $user_pass, $db_name); // 检查数据库连接 if (!$con) { die(json_encode(array('response' => "数据库连接失败: " . mysqli_connect_error()))); } // 校验上传参数是否存在 if (!isset($_FILES['image']) || !isset($_POST['productname']) || !isset($_POST['storename'])) { echo json_encode(array('response' => "缺少必要参数")); mysqli_close($con); exit; } $file = $_FILES['image']; $productname = trim($_POST['productname']); $storename = trim($_POST['storename']); // 校验上传文件是否有效 if ($file['error'] !== UPLOAD_ERR_OK) { echo json_encode(array('response' => "文件上传错误,错误码: " . $file['error'])); mysqli_close($con); exit; } // 安全处理文件名,避免路径遍历 $extension = pathinfo($file['name'], PATHINFO_EXTENSION); $safe_filename = preg_replace('/[^a-zA-Z0-9_\-]/', '', $productname) . '.' . $extension; $upload_path = "ecomerceimage/" . $safe_filename; // 确保上传目录存在 if (!is_dir("ecomerceimage")) { mkdir("ecomerceimage", 0755, true); } // 使用预处理语句避免SQL注入 $sql = "INSERT INTO `imageinfo` (`image`, `storename`, `productname`) VALUES (?, ?, ?);"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "sss", $safe_filename, $storename, $productname); if (mysqli_stmt_execute($stmt)) { // 移动临时文件到目标路径(这才是处理上传文件的正确方式) if (move_uploaded_file($file['tmp_name'], $upload_path)) { echo json_encode(array('response' => "图片上传成功")); } else { echo json_encode(array('response' => "图片保存失败")); // 可在此回滚数据库插入操作 mysqli_stmt_rollback($con); } } else { echo json_encode(array('response' => "数据库插入失败: " . mysqli_stmt_error($stmt))); } mysqli_stmt_close($stmt); mysqli_close($con); ?>
关键修正点
- 正确处理上传文件:使用
move_uploaded_file()将临时文件($_FILES['image']['tmp_name'])移动到目标路径,这是PHP处理文件上传的标准方式,无需base64解码。 - SQL注入防护:采用预处理语句绑定参数,避免直接拼接用户输入到SQL语句中。
- 参数校验:增加对上传参数、文件上传状态的校验,提前拦截错误。
- 安全文件名处理:过滤文件名中的非法字符,防止路径遍历攻击;同时确保上传目录存在。
- 错误反馈:补充详细错误信息,便于排查问题。
Postman测试注意事项
- 请求方法选择
POST,请求体选择form-data。 - 添加三个字段:
image:类型选File,选择要上传的图片文件。productname:输入产品名称。storename:输入店铺名称。
内容的提问来源于stack exchange,提问作者Gum Naam
相关产品推荐
相关产品推荐

