Flutter Web文件上传报错:PHP端提示Undefined array key 'file'
问题原因
你遇到的报错核心是传输方式不匹配:Flutter Web将文件转成Base64后放在JSON请求体里发送,但PHP的$_FILES仅处理multipart/form-data格式的标准文件上传请求,因此找不到file键导致报错。
解决方案
提供两种可行的解决方式,可根据需求选择:
方案一:修改Flutter代码,使用标准文件上传格式(推荐)
将请求改为multipart/form-data类型,适配PHP的$_FILES接收逻辑,调整后的Flutter代码如下:
void _uploadFile(Event event) async { print("called"); final files = uploadInput.files; final file = files![0]; _fileNameController.text = file.name; // 构建multipart格式请求 var request = http.MultipartRequest( 'POST', Uri.parse("http://url/img_test/img.php"), ); // 将Web端File转为MultipartFile request.files.add(await http.MultipartFile.fromBytes( 'file', await file.readAsBytes(), filename: file.name, )); var response = await request.send(); final responseBody = await response.stream.bytesToString(); print(responseBody); if (response.statusCode == 200) { print("ok"); } else { print("try"); } }
PHP代码可保留原逻辑,建议增加基础校验:
<?php // 确保uploads目录存在,不存在则创建 if (!is_dir('uploads')) { mkdir('uploads', 0777, true); } // 校验是否接收到文件 if (isset($_FILES['file'])) { move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']); echo "上传成功"; } else { echo "未接收到文件"; } ?>
方案二:修改PHP代码,解析Base64格式文件
如果不想改动Flutter代码,可修改PHP来解析请求体中的JSON数据,解码Base64后保存文件:
<?php // 读取请求体的JSON内容 $json = file_get_contents('php://input'); $data = json_decode($json, true); // 校验是否存在file字段 if (isset($data['file'])) { // 解码Base64文件内容 $fileContent = base64_decode($data['file']); // 生成唯一文件名(可根据实际需求调整后缀) $fileName = 'uploads/' . uniqid() . '.png'; // 确保uploads目录存在 if (!is_dir('uploads')) { mkdir('uploads', 0777, true); } // 写入文件到服务器 file_put_contents($fileName, $fileContent); echo "上传成功"; } else { echo "未接收到file字段"; } ?>
此方案下Flutter代码无需修改。
内容的提问来源于stack exchange,提问作者M.A. MONYEEM
相关产品推荐
相关产品推荐

