Flutter插件flutter_nos的使用方法详解

Flutter插件flutter_nos的使用方法详解

Flutter 版的网易数帆对象存储直传 SDK,支持 Android & iOS。

pub package

开始使用

添加依赖:

dependencies:
  flutter_nos: ^{latest_version}

用法

第一步,初始化:

final _nosUploader = FlutterNos();

[@override](/user/override)
void initState() {
  _nosUploader.init();
}

第二步,设置上传成功后的回调:

_nosUploader.setOnSuccess((message) {
  // 上传成功
  print('flutter_nos: ==============> upload success, message = $message');
});

第三步,调用上传接口:

// 先调用后端接口获取 token 数据
var nosToken = await getTokenRequest();

var bucketName = nosToken.bucketName ?? '';
var objName = nosToken.objName ?? '';
var uploadToken = nosToken.uploadToken ?? '';
var imagePath = _chosenPic;
// 开始上传图片
_nosUploader.uploadImage(bucketName, objName, uploadToken, imagePath);

示例代码

以下是完整的示例代码:

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_nos/flutter_nos.dart';
import 'package:flutter_nos_example/nos_token.dart';
import 'package:http/http.dart' as http;
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _nosUploader = FlutterNos();

  final _imagePicker = ImagePicker();

  final _imageCropper = ImageCropper();

  String _chosenPic = '';

  String avatarUrl = '';

  String _avatarUrl = '';

  [@override](/user/override)
  void initState() {
    super.initState();

    _nosUploader.init();
    _nosUploader.setOnSuccess((message) {
      // 上传成功
      print('flutter_nos: ==============> upload success, message = $message');

      setState(() {
        avatarUrl = _avatarUrl;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('flutter_nos 插件示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                  onPressed: () {
                    chooseImage();
                  },
                  child: const Text('选择图片')),
              if (_chosenPic.isNotEmpty) Image.asset(_chosenPic),
              const SizedBox(height: 16),
              ElevatedButton(
                  onPressed: () {
                    uploadImage();
                  },
                  child: const Text('上传图片')),
              if (avatarUrl.isNotEmpty)
                Image.network(
                  avatarUrl,
                  width: 200,
                  height: 200,
                  fit: BoxFit.contain,
                ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> chooseImage() async {
    final XFile? image =
        await _imagePicker.pickImage(source: ImageSource.gallery);
    if (image != null) {
      CroppedFile? croppedFile = await _imageCropper.cropImage(
        sourcePath: image.path,
        uiSettings: [
          AndroidUiSettings(
            toolbarTitle: '图片裁剪',
            toolbarWidgetColor: Colors.white,
            initAspectRatio: CropAspectRatioPreset.original,
            lockAspectRatio: false,
            hideBottomControls: true,
          ),
          IOSUiSettings(
            minimumAspectRatio: 1.0,
            cancelButtonTitle: '取消',
            doneButtonTitle: '完成',
          ),
        ],
      );
      if (croppedFile != null) {
        setState(() => _chosenPic = croppedFile.path);
      }
    }
  }

  Future<NosToken> getTokenRequest() async {
    // 向后端发起请求,获取 token 和图片链接
    final response = await http.get(Uri.parse('https://request_url'));
    if (response.statusCode == 200) {
      // TODO: 根据实际业务需求修改数据结构
      return NosToken.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('请求失败');
    }
  }

  Future<void> uploadImage() async {
    var nosToken = await getTokenRequest();

    var bucketName = nosToken.bucketName ?? '';
    var objName = nosToken.objName ?? '';
    var uploadToken = nosToken.uploadToken ?? '';
    var imagePath = _chosenPic;
    // 开始上传图片
    _nosUploader.uploadImage(bucketName, objName, uploadToken, imagePath);
    // 保存图片链接
    _avatarUrl = nosToken.targetUrl ?? '';
  }
}

更多关于Flutter插件flutter_nos的使用方法详解的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件flutter_nos的使用方法详解的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_nos 是一个Flutter插件,专门用于集成网易云信的对象存储服务(NOS)。NOS(Netease Object Storage)是网易云信提供的一种云存储服务,类似于阿里云的OSS、腾讯云的COS等。通过 flutter_nos 插件,开发者可以在Flutter应用中轻松实现文件的上传、下载、删除等操作。

flutter_nos 插件的潜在用途

  1. 文件上传与下载

    • 应用场景:用户可以在应用中上传图片、视频、音频等文件到NOS,并随时下载这些文件。
    • 示例:社交类应用中的图片分享、视频上传;教育类应用中的课件下载。
  2. 多媒体资源管理

    • 应用场景:应用中的多媒体资源(如图片、视频)可以存储在NOS中,通过插件进行管理。
    • 示例:电商应用中的商品图片、视频展示;新闻类应用中的图片和视频新闻。
  3. 数据备份与恢复

    • 应用场景:用户的重要数据可以备份到NOS中,需要时可以恢复。
    • 示例:笔记类应用中的笔记备份;健康类应用中的健康数据备份。
  4. 跨平台文件同步

    • 应用场景:用户在不同设备上使用应用时,可以通过NOS实现文件的同步。
    • 示例:跨平台的笔记应用、文件管理应用。
  5. 大规模文件存储与分发

    • 应用场景:对于需要存储和分发大规模文件的应用,NOS提供了高效的解决方案。
    • 示例:在线教育平台中的课程资源分发;企业内部的文档共享平台。
  6. 安全与权限控制

    • 应用场景:通过NOS的权限控制功能,可以设置文件的访问权限,确保数据安全。
    • 示例:企业内部的文件管理系统;医疗应用中的患者隐私数据存储。
  7. 日志与监控

    • 应用场景:NOS提供了日志和监控功能,可以记录文件的上传、下载等操作,便于审计和监控。
    • 示例:企业级应用中的操作日志记录;安全敏感应用中的操作监控。

使用 flutter_nos 的优势

  • 易集成flutter_nos 提供了简洁的API,便于开发者快速集成NOS服务。
  • 跨平台:支持iOS和Android平台,确保应用在不同设备上的一致性。
  • 高效稳定:基于网易云信的NOS服务,提供高效的存储和分发能力,确保应用的稳定性。
  • 安全性:支持多种权限控制和加密方式,确保数据的安全性。

使用示例

以下是一个简单的 flutter_nos 使用示例,展示如何上传文件到NOS:

import 'package:flutter_nos/flutter_nos.dart';

void uploadFile() async {
  // 初始化NOS客户端
  NOS nos = NOS(
    accessKey: 'your_access_key',
    secretKey: 'your_secret_key',
    endpoint: 'your_endpoint',
    bucketName: 'your_bucket_name',
  );

  // 上传文件
  String filePath = '/path/to/your/file';
  String objectKey = 'your_object_key';
  try {
    await nos.uploadFile(filePath, objectKey);
    print('File uploaded successfully');
  } catch (e) {
    print('Failed to upload file: $e');
  }
}
回到顶部