如何在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
相关产品推荐
相关产品推荐

