Flutter FTP 上传文件 (FtpConnect中文编码)

一、插件 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'));(共两处)

你可能感兴趣的:(项目,Flutter学习,flutter,android)