Flutter百度网盘操作插件baidupan的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter百度网盘操作插件baidupan的使用

BaiduPan

百度网盘的 API 可以帮助在 Dart 中对接百度网盘。目前理论上不支持 web,因为引入了 dart:io 包。有一些未对接的接口可以查看 官方文档

API 的配置

百度开放平台的应用列表 中获取 AppKey 和 AppSecret。

授权码

写在前面:这里要注意一点,非常重要,请仔细阅读后再继续!!!!不要把 code 或 access_token 暴露给任何人,因为有了这个东西,别人就能访问你的百度网盘了,甚至可以删除你所有数据。

code 10 分钟过期, 暂时是手动填入, 当然你可以自己寻求自动化的进程, 或者如果你有服务器端, 也可以使用服务端授权模式,这和本 SDK 无关。

获取到 accessToken 后保存下来,下次需要时直接使用即可, 这个 accessToken 的的有效期为 30 天,可以使用 refresh_token 刷新, 但是我这里没做刷新的相关逻辑,有需要的时候请重新获取 accessToken。

使用代码简化步骤

BaiduAuthManager 可以简化这个过程。

void main() async {
  final authManager = BaiduAuthManager(appId, appSecret);
  final uri = authManager.getAuthUrl();
  print(uri); // 这里使用浏览器访问这个 url ,然后复制 code,

  final auth = await authManager.requestAccessToken(code);
  print(auth.accessToken); // 这里就是 accessToken, 其他字段的含义请参考官方文档
}

使用说明

因为百度网盘的 API 有一些坑,这里进行了一些封装,然后使用 3 个核心类来对应不同的功能。

具体功能参照官方的说明文档:

  • 入口类

    • BaiduPan: 对应百度网盘的核心 API,主要是获取信息
      • getUserInfo: 获取用户信息
      • getDiskSpace: 获取网盘空间信息
      • getFileList: 获取文件列表
      • getFileListAll: 递归获取文件列表
      • getDocList: 获取文档列表
      • getImageList: 获取图片列表
      • getVideoList: 获取视频列表
      • getBtList: 获取 BT 列表
      • getCountOfPathByType: 获取某个目录下的文件类型数量
      • getCategoryList: 获取网盘分类列表
      • search: 搜索
      • getMetaData: 获取文件元数据
      • getDownloadRequest: 获取下载请求
      • getDownloadUrl: 获取下载地址
  • 操作文件管理类

    • BaiduPanFileManager: 操作文件的管理类
      • copy: 复制文件
      • move: 移动文件
      • rename: 重命名文件
      • delete: 删除文件
      • createFolder: 创建文件夹
  • 上传文件管理类

    • BaiduPanUploadManager: 上传文件的管理类
      • preCreate: 预创建文件
      • uploadSinglePart: 上传分片文件
      • merge: 合并分片(上传完成)

上传文件的断点续传问题

如果文件过大或网络不稳定,可能会中断,这里封装了一个类可以帮助解决这个问题。

BaiduUploadHelper

运行在内存中

这种情况适用于程序未关闭的情况下,比如 app 或服务器端程序。

只需要重新调用同一个对象的 startUpload 即可。原理是对象内保存了下载的 md5 列表和 uploadId, 这样可以自动续传。

运行在命令行中

因为每次可能都要开启一个新的程序来上传,这时需要将断点信息保存至文件内,在下次加载时传入对象内。

使用 saveProgressToFile 来保存进度信息到 file。

使用 BaiduUploadHelper.resumeFromFile 来从文件恢复。

命令行工具

项目提供了一个简单的的上传工具,需要配合 pub global 使用。

使用前需要配置文件或环境变量以访问 access_token。

安装

dart pub global activate baidupan

使用配置文件

配置文件的方式:生成一个 config.json 文件,$HOME/.config/baidupan/config.json,这个文件的格式如下:

{
  "expires_in": 2592000,
  "refresh_token": "",
  "access_token": "",
  "session_secret": "",
  "session_key": "",
  "scope": "basic netdisk"
}

这个文件可以使用 request_baidu_auth 工具生成。

export baidu_app_id=xxx
export baidu_app_secret=xxx

# 如果你已经获取了 code,请设置环境变量
export baidu_request_code=xxx

dart run bin/request_baidu_auth.dart

or

request_baidu_auth

环境变量

还可以通过环境变量设置 access_token

export BAIDU_PAN_ACCESS_TOKEN=xxx

上传文件

# 上传
bd_upload <local_path> <remote_path>

更多关于Flutter百度网盘操作插件baidupan的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter百度网盘操作插件baidupan的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用baidupan插件进行百度网盘操作的示例代码。baidupan插件假设已经存在并可用,但实际使用中你可能需要查阅官方文档以获取最新的API和配置方法。

首先,确保你的Flutter项目中已经添加了baidupan依赖。在pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  baidupan: ^最新版本号  # 请替换为实际版本号

然后运行flutter pub get来获取依赖。

接下来,我们编写Flutter代码来使用这个插件。假设baidupan插件提供了基本的登录、上传和下载功能。以下是一个简化的示例:

import 'package:flutter/material.dart';
import 'package:baidupan/baidupan.dart'; // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  BaiduPan? _baiduPan;
  String _statusText = "未登录";

  @override
  void initState() {
    super.initState();
    // 初始化BaiduPan实例
    _baiduPan = BaiduPan(
      clientId: '你的Client ID', // 替换为你的百度网盘API Client ID
      clientSecret: '你的Client Secret', // 替换为你的百度网盘API Client Secret
    );

    // 登录(这里假设有自动登录或手动触发登录的逻辑)
    _login();
  }

  Future<void> _login() async {
    try {
      // 假设login方法返回一个认证token
      String token = await _baiduPan!.login('用户名', '密码'); // 注意:实际使用中应避免明文存储密码
      setState(() {
        _statusText = "登录成功,Token: $token";
      });
    } catch (e) {
      setState(() {
        _statusText = "登录失败: ${e.message}";
      });
    }
  }

  Future<void> _uploadFile() async {
    try {
      String filePath = '本地文件路径'; // 替换为你要上传的本地文件路径
      String remotePath = '/远程/路径/文件名'; // 替换为你想在百度网盘上保存的路径和文件名
      await _baiduPan!.upload(filePath, remotePath);
      setState(() {
        _statusText = "文件上传成功";
      });
    } catch (e) {
      setState(() {
        _statusText = "文件上传失败: ${e.message}";
      });
    }
  }

  Future<void> _downloadFile() async {
    try {
      String remotePath = '/远程/路径/文件名'; // 替换为你想下载的百度网盘文件路径
      String localPath = '本地保存路径'; // 替换为你想保存文件的本地路径
      await _baiduPan!.download(remotePath, localPath);
      setState(() {
        _statusText = "文件下载成功";
      });
    } catch (e) {
      setState(() {
        _statusText = "文件下载失败: ${e.message}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('BaiduPan Flutter 插件示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                _statusText,
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _uploadFile,
                child: Text('上传文件'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: _downloadFile,
                child: Text('下载文件'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 上述代码仅为示例,实际使用中baidupan插件的API可能会有所不同,请参考插件的官方文档。
  2. 登录部分应避免明文存储密码,实际应使用OAuth2等安全机制进行用户授权。
  3. 上传和下载功能需要处理文件路径和权限等问题,确保应用有适当的文件访问权限。
  4. 错误处理应更加细致,以便更好地向用户反馈问题。

请查阅baidupan插件的官方文档以获取最新的API信息和最佳实践。

回到顶部