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

Flutter如何在列表展示多项内容并批量上传照片到FTP服务器

解决方案

问题原因

你的代码当前存在几个核心问题导致无法批量上传:

  • 仅读取了photos列表的第一个元素photos.first上传,没有遍历整个文件列表
  • 固定写死的重命名逻辑会导致所有文件上传后被覆盖,无法保留多个文件
  • 你原来代码里的sizeFile('$photos')属于无效调用,传参是整个列表而非单个文件路径

优化后的实现代码

final photos = <File>[];

Future<void> fileUpload() async {
  FTPConnect ftpConnect = FTPConnect('xxxxxxxx',
      user: 'xxxxxxxxx',
      pass: 'xxxxxxxxx',
      port: xx,
      debug: true);
  try {
    // FTP连接和目录切换仅执行一次,复用连接减少开销
    await ftpConnect.connect();
    // 支持直接传入多级路径,简化目录切换调用
    await ftpConnect.changeDirectory('public_html/assets/images/app');

    // 遍历所有照片文件逐个上传
    for (var photoFile in photos) {
      try {
        // 动态生成唯一文件名,避免文件覆盖,这里默认取原文件名,你也可以自定义命名规则
        String fileName = photoFile.path.split('/').last;
        // 上传当前文件,指定远程文件名
        await ftpConnect.uploadFile(photoFile, sRemoteName: fileName);
        // 如果需要自定义重命名逻辑,可以在这里写动态规则,比如给文件名加前缀/时间戳
        // await ftpConnect.rename(fileName, '自定义标识_$fileName');
      } catch (fileErr) {
        // 单个文件上传失败仅打印日志,不中断其他文件的上传流程,你也可以根据业务需求调整逻辑
        await _log('单文件上传失败 ${photoFile.path}: ${fileErr.toString()}');
      }
    }

    await ftpConnect.disconnect();
  } catch (e) {
    // 全局异常处理,比如FTP连接失败、目录切换失败等场景
    await _log('FTP全局错误: ${e.toString()}');
    // 异常时确保断开连接,避免连接泄漏
    if (ftpConnect.isConnected) {
      await ftpConnect.disconnect();
    }
  }
}

额外说明

  • 如果有特殊的文件名命名要求,可以修改fileName的生成逻辑,比如叠加用户ID、拍摄时间戳等标识,保证文件唯一性
  • 如果业务要求所有文件必须全部上传成功才算完成,可以移除内部的单文件异常捕获,改为全局统一捕获即可
  • 如果你需要在列表中展示照片条目,直接遍历photos列表,用Image.file(photoFile)组件渲染即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:27:03