human: 如何处理七牛云的对象存储Flutter SDK

gpt: [对象存储](https://developer.qiniu.com/kodo) > SDK 下载 > Flutter SDK

#  Flutter SDK

最近更新时间: 2022-06-22 16:03:06

Flutter SDK 只包含了最终用户使用场景中的必要功能。相比服务端 SDK 而言，客户端 SDK 不会包含对云存储服务的管理和配置功能。

  * [Flutter SDK 源码地址 __](https://github.com/qiniu/dart-sdk/blob/master/flutter/README.md)
  * [Flutter SDK 下载地址 __](https://github.com/qiniu/dart-sdk/releases)

# 安全机制

该 SDK 未包含凭证生成相关的功能。开发者对安全性的控制应遵循
[安全机制](https://developer.qiniu.com/kodo/manual/1644/security)
中建议的做法，即客户端应向业务服务器每隔一段时间请求
[上传凭证](https://developer.qiniu.com/kodo/manual/1208/upload-token) ，而不是直接在客户端使用
AccessKey / SecretKey 生成对应的凭证。在客户端使用 SecretKey 会导致严重的安全隐患。

开发者可以在生成上传凭证前通过配置 [上传策略](https://developer.qiniu.com/kodo/manual/1206/put-
policy) 来控制上传的后续动作，例如在上传完成后通过回调机制通知业务服务器。该工作在业务服务器端进行，因此非本 SDK 的功能范畴。

存储的服务端 SDK 提供了上传凭证的生成功能，请参考各个服务端语言的 SDK 文档。

# 安装

编辑你的 pubspec.yaml 文件，在 dependencies 添加 qiniu-flutter-sdk，如下：

    
    
    dependencies:
      ...
      qiniu_flutter_sdk: // 这里输入你需要的版本
    

推荐使用最新版：v0.1.0

# 上传文件

SDK 内置两种上传方式：表单上传和分片上传，并根据具体情况，内部做了自动切换。表单上传使用一个 HTTP POST
请求完成文件的上传，因此比较适合较小的文件和较好的网络环境。相比而言，分片上传更能适应不稳定的网络环境，也比较适合上传比较大的文件（例如数百 MB
或更大）。

若需深入了解上传方式之间的区别，请参阅上传类型中
[表单上传](https://developer.qiniu.com/kodo/manual/1272/form-upload) 和 [分片上传
V2](https://developer.qiniu.com/kodo/api/6364/multipartupload-interfaced)
接口说明。

    
    
    import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
     // 创建 storage 对象
      storage = Storage();
    
      // 创建 Controller 对象
      putController = PutController();
    
      // 添加任务进度监听
      putController.onProgress((double percent) {
        print('任务进度变化：已发送：$percent');
      });
    
      // 添加文件发送进度监听
      putController.onSendProgress((double percent) {
        print('已上传进度变化：已发送：$percent');
      });
    
      // 添加任务状态监听
      putController.addStatusListener((StorageStatus status) {
        print('状态变化: 当前任务状态：$status');
      });
    
      // 指定上传对象key
      key = '指定object名称';
    
      // 使用 storage 的 putFile 对象进行文件上传
      storage.putFile(File('./file.txt'), 'TOKEN', PutOptions(
        controller: putController,
        key: key,
      ))
      // 取消当前任务
      putController.cancel()
    

**storage**  
使用前必须创建一个 Storage 实例。同时，在构造 Storage 时可以传入一个 Config 控制内部的一些行为，如下

    
    
     // 创建 storage 对象
      storage = Storage(Config(
        // 通过自己的 hostProvider 来使用自己的 host 进行上传
        hostProvider: HostProvider,
        // 可以通过实现 cacheProvider 来自己实现缓存系统支持分片断点续传
        cacheProvider: CacheProvider,
        // 如果你需要对网络请求进行更基础的一些操作，你可以实现自己的 HttpClientAdapter 处理相关行为
        httpClientAdapter: HttpClientAdapter,
        // 设定网络请求重试次数
        retryLimit: 3,
      ));
    

**PutController**  
这里是一个重要的内容，对于整个上传任务的一些交互被封装到了这里， PutController 用于对上传任务添加进度、状态的监听，同时可以通过
PutController.cancel() 对正在上传的任务进行取消，使用姿势参考上面代码示例。  
**putFile**  
该接口内部封装了分片上传和表单上传两种实现，会根据文件的尺寸和上传配置信息自动选择使用分片还是直传的方式来上传对象。File指定上传对象本地路径，Token为上传凭证。  
**PutOptions**  
SDK默认在对象大小超过4MB使用分片上传，默认分片之间采用并发上传，并发大小为5，可以通过PutOptions中的参数控制，参数如下：

    
    
    class PutOptions {
      /// 资源名，如果不传则后端自动生成
      final String key;
    
      /// 强制使用直传，不使用分片
      final bool forceBySingle;
    
      /// 使用分片上传时的分片大小，默认值 4，单位为 MB
      final int partSize;
    
      /// 并发上传的队列长度，默认值为 5
      final int maxPartsRequestNumber;
    
      /// 控制器
      final PutController controller;
    }
    

**其他**  
_**HostProvider**_  
SDK 会根据 TOKEN 自动获取上传域名，不需要客户关系上传域名，除非你使用的是七牛的专有云服务，则可以通过实现自己的 HostProvider
来向自己的服务进行上传。  
_**CacheProvider**_  
SDK 支持分片断点续传功能，断点续传的信息通过 CacheProvider
提供的能力进行存储，如果你需要更好的体验，可以自己实现这个接口来对信息进行持久化的存储。  
_**HttpClientAdapter**_  
如果你需要对网络请求进行进一步的自定义处理时，你可以通过实现一个 HttpClientAdapter 来接管 SDK 的所有请求。

# API 参考

  * [存储 API 参考](https://developer.qiniu.com/kodo/api/3939/overview-of-the-api)

# 贡献代码

  1. 登录 https://github.com
  2. Fork git@github.com:qiniu/dart-sdk.git
  3. 创建您的特性分支 (git checkout -b new-feature)
  4. 提交您的改动 (git commit -am ‘Added some features or fixed a bug’)
  5. 将您的改动记录提交到远程 git 仓库 (git push origin new-feature)
  6. 然后到 github 网站的该 git 远程仓库的 new-feature 分支下发起 Pull Request

以上内容是否对您有帮助？