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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:55:27