一、插件 FtpConnect
插件:ftpconnect: ^2.0.5
地址:https://pub-web.flutter-io.cn/packages/ftpconnect
仓库:https://github.com/salim-lachdhaf/dartFTP/tree/master
二、引入
依赖于2.17.0≤Dart版本≤3.0.0,即依赖Flutter3.0.0版本以上,经过测试,实际并没有严格依赖,只是因为作者打包插件的开发环境影响,会导致版本差异时无法安装成功。
解决对策1:升级Flutter版本后引入ftpconnect: ^2.0.5
解决对策2:到项目仓库拉取代码,将lib
文件夹整个复制到项目中
三、使用
3.1 创建连接
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import '../../util/ftp/src/ftpconnect_base.dart'; // 这里使用对策2解决引入问题
class FtpApi {
// ftpConnect 配置
static FTPConnect ftpConnect = FTPConnect(
"填写你的FTP服务器地址",
user:"填写你的FTP服务器账号",
pass: "填写你的FTP服务器密码",
showLog: true, // 是否打印日志
port: 21, // FTP服务器端口号,21可不用填写
timeout: 300, // 设置超时时间避免大文件超时中断
);
}
// 连接FTP服务器(会在一段时间内保持连接)
Future<bool> openFtp() async {
var connect = await ftpConnect.connect();
if (!connect) {
Fluttertoast.showToast(
msg: "Ftp服务器链接失败!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0,
);
return false;
}
return true;
}
// 关闭FTP服务器连接、在进行相关操作后可以选择调用手动关闭
Future<void> closeFtp() async {
await ftpConnect.disconnect();
}
3.2 验证并创建目录
1.0.0
版本的ftpconnect
验证并创建目录方法createFolderIfNotExist
貌似存在bug、未测试在2.0.5
中是否修复,直接使用目录查找和目录创建实现此功能:
// 实现验证并创建目录
createFolderIfNotExist(path) async {
print(path);
var hasDir = await ftpConnect.checkFolderExistence(path);
if (!hasDir) {
await ftpConnect.makeDirectory(path);
}
}
3.3 上传文件
Future<bool> uploadFiles(localPath,serverPath,fileName) async {
try {
// 如果服务器目标目录不存在,则创建一个目录
await createFolderIfNotExist(serverPath);
var operate = await ftpConnect.uploadFile(
File(localPath),// 参数传入一个文件对象
sRemoteName: serverPath+ '/' + fileName + '.' + localPath.split(".").last, // 最终指向路径类似于:A/B/file.png
);// 如果上传成功返回true,失败则是false
print(operate);
return operate;
} catch (e) {
print(e);
return false;
} finally {}
}
四、编码问题
之所以使用拉取项目进行引入的方式,就是为了便于对FtpConnect源码进行简单修改,目测出现中文乱码的原因在于,文件服务器的编码类型大概率是GBK的,所以需要修改一下FtpConnect插件向服务器发送相关指令的部分代码
4.1 引入
首先引入GBK编码fast_gbk: 1.0.0
4.2 修改编码规则
在引入的包中找到src/ftp_socket.dart
,将_socket.write(Utf8Codec().encode('$cmd\r\n'));
修改为_socket.write(gbk.encode('$cmd\r\n'));
(共两处)