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

如何在Flutter中连接FTP服务器并下载文件至移动设备?

嘿,我刚好有过类似的开发经验,给你分享几个靠谱的方案,帮你搞定Flutter里的FTP文件下载~

在Flutter中实现FTP连接与文件下载

1. 选择合适的FTP插件

其实Flutter社区有几个成熟的FTP插件可以用,我常用的是ftpconnect和dart_ftp,这两个都能满足基本的连接、下载需求,不用自己从零造轮子。

2. 使用ftpconnect实现下载(推荐,API更直观)

第一步:添加依赖

在你的pubspec.yaml里加入依赖:

dependencies:
  ftpconnect: ^2.2.0 # 可以去pub.dev查看最新版本号

然后运行flutter pub get完成安装。

第二步:处理设备存储权限

不管是Android还是iOS,下载文件都需要申请存储权限:

  • Android:在android/app/src/main/AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- Android 13及以上还需添加 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    
  • iOS:在ios/Runner/Info.plist中添加权限描述:
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要访问相册存储下载的文件</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>需要访问相册读取文件</string>
    

可以配合permission_handler插件动态申请权限,这个应该是你开发中常用的工具了。

第三步:编写下载代码

下面是完整的示例代码,我加了详细注释:

import 'package:ftpconnect/ftpconnect.dart';
import 'package:path_provider/path_provider.dart';

Future<void> downloadFileFromFTP() async {
  // 初始化FTP连接实例
  final ftpConnect = FTPConnect(
    "your_ftp_server_address", // 例如:ftp.yourdomain.com
    user: "your_ftp_username",
    pass: "your_ftp_password",
    port: 21, // 默认FTP端口是21,若服务器用了自定义端口请修改
  );

  try {
    // 建立FTP连接
    await ftpConnect.connect();
    print("FTP连接成功!");

    // 获取设备的本地存储路径(这里用应用专属文档目录,也可以换成外部公共存储)
    final appDocDir = await getApplicationDocumentsDirectory();
    final localSavePath = "${appDocDir.path}/downloaded_file.pdf";

    // 执行下载操作,传入远程文件路径和本地保存路径
    await ftpConnect.downloadFile(
      "/remote/server/path/your_target_file.pdf",
      localSavePath,
      onProgress: (progress) {
        // 这里可以实时更新下载进度,比如给进度条赋值
        print("当前下载进度:${progress.toStringAsFixed(0)}%");
      },
    );

    print("文件下载完成,本地路径:$localSavePath");
  } catch (e) {
    print("FTP操作出错:$e");
  } finally {
    // 无论成功失败,记得断开FTP连接
    await ftpConnect.disconnect();
  }
}

3. 另一个选择:dart_ftp

如果ftpconnect满足不了你的特殊需求(比如需要更底层的FTP命令支持),可以试试dart_ftp,示例代码如下:

import 'package:dart_ftp/dart_ftp.dart';
import 'package:path_provider/path_provider.dart';

Future<void> downloadWithDartFtp() async {
  final ftpClient = FtpClient('your_ftp_server', user: 'username', pass: 'password');
  await ftpClient.connect();

  try {
    final appDocDir = await getApplicationDocumentsDirectory();
    final localPath = "${appDocDir.path}/test_file.txt";
    // 下载远程文件到本地
    await ftpClient.downloadFile('/remote/path/test_file.txt', localPath);
    print("下载完成!");
  } catch (e) {
    print("下载出错:$e");
  } finally {
    await ftpClient.disconnect();
  }
}

4. 额外注意事项

  • 如果你需要连接SFTP(安全加密FTP),上面的插件不支持,需要用ssh_client这类SSH相关插件自己封装逻辑。
  • 测试时确保FTP服务器允许外部IP连接,没有防火墙或端口限制,账号密码权限正确。
  • 下载大文件时,建议把下载逻辑放到Isolate中执行,避免阻塞UI线程,可以用flutter_isolate插件简化操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:05