Flutter百度网盘操作插件baidupan的使用
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
更多关于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('下载文件'),
),
],
),
),
),
);
}
}
注意:
- 上述代码仅为示例,实际使用中
baidupan
插件的API可能会有所不同,请参考插件的官方文档。 - 登录部分应避免明文存储密码,实际应使用OAuth2等安全机制进行用户授权。
- 上传和下载功能需要处理文件路径和权限等问题,确保应用有适当的文件访问权限。
- 错误处理应更加细致,以便更好地向用户反馈问题。
请查阅baidupan
插件的官方文档以获取最新的API信息和最佳实践。