better_aliyun_oss 0.0.8 copy "better_aliyun_oss: ^0.0.8" to clipboard
better_aliyun_oss: ^0.0.8 copied to clipboard

A Simple Aliyun OSS Upload for Flutter.

example/lib/main.dart

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:better_aliyun_oss/better_aliyun_oss.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
import 'package:mime/mime.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:uuid/uuid.dart';

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

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

class _MyAppState extends State<MyApp> {
  late BetterAliyunOssClient ossClient;

  late StreamSubscription eventStreamSubscription;

  // 简单数据上传请求
  BetterAliyunOssClientRequest? simplePutRequest;

  // 分片数据
  List<BetterAliyunOssPart> partList = [];

  // 分片数据上传请求
  Map<BetterAliyunOssPart, BetterAliyunOssClientRequest> partRequestMap = {};

  @override
  void initState() {
    super.initState();

    ossClient = BetterAliyunOssClient(credentials);
    eventStreamSubscription = ossClient.eventStream.listen((event) {
      if (event.event == BetterAliyunOssClientEventEnum.progress) {
        return;
      }

      print("$event");

      for (final part in partList) {
        if (partRequestMap[part]!.requestTaskId == event.requestTaskId && event.event == BetterAliyunOssClientEventEnum.success) {
          part.partETag = event.data.toString();
        }
      }
    });
  }

  @override
  void dispose() {
    eventStreamSubscription.cancel();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              CupertinoButton(
                child: Text('基础上传'),
                onPressed: simpleUpload,
              ),
              CupertinoButton(
                child: Text('取消基础上传'),
                onPressed: cancelSimpleUpload,
              ),
              CupertinoButton(
                child: Text('分片上传 初始化'),
                onPressed: initiateMultipartUpload,
              ),
              CupertinoButton(
                child: Text('分片上传'),
                onPressed: uploadPartList,
              ),
              CupertinoButton(
                child: Text('取消分片上传'),
                onPressed: cancelUploadPartList,
              ),
              CupertinoButton(
                child: Text('分片上传 完成'),
                onPressed: completeMultipartUpload,
              ),
            ],
          ),
        ),
      ),
    );
  }

  void simpleUpload() async {
    // 保存图片到本地
    final bytes = Uint8List.view((await rootBundle.load("images/landscape.jpeg")).buffer);
    final file = File(path.join((await getTemporaryDirectory()).path, "landscape.jpeg"));
    if (!file.existsSync()) {
      await file.writeAsBytes(bytes);
    }

    final objectFileName = Uuid().v1().replaceAll("-", "") + path.extension(file.path);
    final objectPath = "image/diary/${DateFormat("yyyyMM").format(DateTime.now())}/$objectFileName";

    simplePutRequest = ossClient.putObject(
      bucket: () async => "my-bucket",
      endpoint: () async => "oss-cn-hangzhou.aliyuncs.com",
      domain: () async => "https://domain.com",
      objectPath: objectPath,
      contentType: lookupMimeType(file.path) ?? "application/octet-stream",
      buffer: bytes,
    );

    print("简单数据上传请求 id : ${simplePutRequest!.requestTaskId}");
  }

  void cancelSimpleUpload() {
    if (simplePutRequest != null) {
      ossClient.cancelPutObject(simplePutRequest!);
    }
  }

  void initiateMultipartUpload() async {
    // 保存图片到本地
    final bytes = Uint8List.view((await rootBundle.load("images/landscape.jpeg")).buffer);
    final file = File(path.join((await getTemporaryDirectory()).path, "landscape.jpeg"));
    if (!file.existsSync()) {
      await file.writeAsBytes(bytes);
    }

    final objectFileName = Uuid().v1().replaceAll("-", "") + path.extension(file.path);
    final objectPath = "image/diary/${DateFormat("yyyyMM").format(DateTime.now())}/$objectFileName";

    final partListTuple = await ossClient.initiateMultipartUpload(
      bucket: () async => "my-bucket",
      endpoint: () async => "oss-cn-hangzhou.aliyuncs.com",
      domain: () async => "https://domain.com",
      objectPath: objectPath,
      contentType: lookupMimeType(file.path) ?? "application/octet-stream",
      filePath: file.path,
    );

    if (partListTuple.item1 != null) {
      partList = partListTuple.item1!;
      print("数据分片成功 $partList");
    } else {
      print("数据分片失败 ${partListTuple.item2}");
    }
  }

  void uploadPartList() async {
    for (var part in partList) {
      final request = ossClient.uploadPart(part: part);
      partRequestMap[part] = request;

      print("数据分片 ${part.partNumber} 的上传请求 id : ${request.requestTaskId}");
    }
  }

  void cancelUploadPartList() {
    if (partRequestMap.keys.length > 0) {
      for (final request in partRequestMap.values.toList()) {
        ossClient.cancelPutObject(request);
      }
      partRequestMap.clear();
    }
  }

  void completeMultipartUpload() async {
    final result = await ossClient.completeMultipartUpload(partList: partList);

    if (result.item1 != null) {
      print("数据分片上传成功 ${result.item1}");
    } else {
      print("数据分片上传失败 ${result.item2}");
    }
  }

  Future<BetterAliyunOssCredentials?> credentials() async {
    final credentials = {
      "SecurityToken": "",
      "AccessKeyId": "",
      "AccessKeySecret": "",
      "Expiration": "",
    };
    return BetterAliyunOssCredentials.fromMap(credentials);
  }
}
1
likes
100
pub points
66%
popularity

Publisher

unverified uploader

A Simple Aliyun OSS Upload for Flutter.

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-2-Clause (license)

Dependencies

better_file_md5_plugin, convert, crypto, dio, flutter, http_parser, intl, path, tuple, xml

More

Packages that depend on better_aliyun_oss