带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),需要加:
如果是JWT认证,要在请求头里带上const xhr = new XMLHttpRequest(); xhr.withCredentials = true; // 带凭证请求Authorization: Bearer 你的token。
二、PHP接收端排查
- 先确认PHP能拿到上传的文件:
在PHP脚本开头加var_dump($_FILES['uploaded_file']);,看输出的数组里:error字段是否为0(0代表无错误,其他值比如1是超了upload_max_filesize限制)tmp_name是否有值(这是服务器临时文件的路径)
- 检查PHP配置:
打开php.ini确认以下参数:upload_max_filesize:设置成足够大的值(比如10M)post_max_size:要比upload_max_filesize更大(比如12M)max_execution_time:避免大文件上传超时(比如60)
- 读取文件内容的正确姿势:
要用临时文件路径读取内容,而不是直接用文件名:$fileContent = file_get_contents($_FILES['uploaded_file']['tmp_name']); - 跨域场景要加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
相关产品推荐
相关产品推荐

