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

带Session认证的跨服务器JS文件上传请求技术求助

排查FormData上传文件存MySQL Blob的问题

嘿,这种看起来简单实则踩坑的文件上传场景我太熟了!结合你说的登录正常但上传环节出问题的情况,咱们从前端构建、PHP接收、MySQL存储三个核心环节逐一排查:

一、前端FormData & 请求检查

  • 确保正确获取文件并添加到FormData:
    const fileInput = document.getElementById('your-file-input-id');
    const formData = new FormData();
    // 一定要取files[0],fileInput本身不是文件对象
    formData.append('uploaded_file', fileInput.files[0]);
    
  • 敲黑板:不要手动给AJAX请求设置Content-Type: multipart/form-data!浏览器会自动生成带边界标识的正确请求头,手动设置反而会导致PHP无法解析FormData。
  • 登录认证相关:如果是跨域上传,要确保AJAX请求携带凭证(比如session cookie),需要加:
    const xhr = new XMLHttpRequest();
    xhr.withCredentials = true; // 带凭证请求
    
    如果是JWT认证,要在请求头里带上Authorization: Bearer 你的token。

二、PHP接收端排查

  1. 先确认PHP能拿到上传的文件:
    在PHP脚本开头加var_dump($_FILES['uploaded_file']);,看输出的数组里:
    • error字段是否为0(0代表无错误,其他值比如1是超了upload_max_filesize限制)
    • tmp_name是否有值(这是服务器临时文件的路径)
  2. 检查PHP配置:
    打开php.ini确认以下参数:
    • upload_max_filesize:设置成足够大的值(比如10M)
    • post_max_size:要比upload_max_filesize更大(比如12M)
    • max_execution_time:避免大文件上传超时(比如60)
  3. 读取文件内容的正确姿势:
    要用临时文件路径读取内容,而不是直接用文件名:
    $fileContent = file_get_contents($_FILES['uploaded_file']['tmp_name']);
    
  4. 跨域场景要加CORS头:
    如果前端和PHP不在同一域名,PHP开头要加:
    header("Access-Control-Allow-Origin: 你的前端域名");
    header("Access-Control-Allow-Credentials: true"); // 允许带凭证
    header("Access-Control-Allow-Methods: POST");
    header("Access-Control-Allow-Headers: Content-Type, Authorization");
    

三、MySQL Blob存储排查

  • 确认字段类型:BLOB只能存64KB以内的文件,大部分图片都不够用,要改成MEDIUMBLOB(最多16MB)或LONGBLOB(最多4GB)。
  • 用预处理语句插入(避免SQL注入+保证二进制数据完整性):
    // 假设用PDO连接数据库
    $pdo = new PDO('mysql:host=你的数据库地址;dbname=你的库名;charset=utf8mb4', '用户名', '密码');
    $stmt = $pdo->prepare("INSERT INTO 你的表名 (file_blob, filename) VALUES (:blob, :name)");
    // 绑定二进制数据,指定PARAM_LOB类型
    $stmt->bindParam(':blob', $fileContent, PDO::PARAM_LOB);
    $stmt->bindParam(':name', $_FILES['uploaded_file']['name']);
    $stmt->execute();
    
  • 避免字符集干扰:连接数据库时一定要指定charset=utf8mb4,防止二进制数据被转义损坏。

四、快速调试技巧

  • 前端用浏览器开发者工具的「Network」面板,查看请求的「Form Data」部分是否正确显示了文件名和大小,请求头是否符合预期。
  • PHP端开启错误提示:
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    直接看脚本执行时的报错信息,比瞎猜高效多了。
  • 临时把文件存到服务器本地验证:
    move_uploaded_file($_FILES['uploaded_file']['tmp_name'], './test_upload.jpg');
    
    如果本地文件能正常打开,说明传输环节没问题,问题出在数据库存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:22:41