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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:21:58