使用fetch()向服务器发送.zip文件时遇到问题
解决FormData上传文件后PHP端无法获取文件字段的问题
嘿,这个问题我之前踩过一模一样的坑!核心原因其实是PHP对FormData里的文件字段和普通文本字段的存储位置完全不同——你找错地方啦!
问题根源
当你通过FormData上传文件时,浏览器会自动把请求编码成multipart/form-data格式。在PHP的处理逻辑里:
- 普通文本字段(比如你这里的
id)会被存到$_POST超全局变量里 - 文件类型的字段(比如你这里的
data)不会出现在$_POST中,而是被单独存到$_FILES超全局变量里
你之前一直盯着$_POST找文件,自然找不到啦😅
正确的PHP处理代码
把你的reciever.php改成下面这样,就能正常拿到文件了:
<?php // 处理普通文本字段(id) if (isset($_POST['id'])) { $decodedId = base64_decode($_POST['id']); echo "解析后的ID:{$decodedId}<br>"; } // 处理上传的文件(data字段) if (isset($_FILES['data'])) { $file = $_FILES['data']; // 先检查文件上传是否出错 if ($file['error'] === UPLOAD_ERR_OK) { // 示例:把文件移动到服务器的uploads目录(需要先创建这个目录并设置写入权限) $targetDir = './uploads/'; if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } $targetPath = $targetDir . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $targetPath)) { echo "文件上传成功,路径:{$targetPath}"; } else { echo "文件移动失败,请检查目录权限"; } } else { echo "文件上传出错,错误码:{$file['error']}"; } } else { echo "未接收到上传的文件,请检查前端是否正确选择了文件"; } ?>
关于你的前端代码
你的前端代码其实完全没问题!不管用fetch还是XMLHttpRequest,只要像你那样正确构建FormData并发送,浏览器会自动处理multipart/form-data的请求头(包括自动添加关键的boundary分隔符),千万不要手动设置Content-Type,手动设置反而可能导致服务器解析错误。
额外检查点
- 确保前端的
fileReciever是一个正确的<input type="file">元素,且用户确实选择了文件 - 服务器端的
uploads目录要有写入权限(否则move_uploaded_file会执行失败) - 如果上传的zip文件很大,需要检查PHP配置里的
upload_max_filesize和post_max_size参数,确保值足够容纳你的文件
内容的提问来源于stack exchange,提问作者dark
相关产品推荐
相关产品推荐

