Flutter AWS S3存储插件simple_s3的使用

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

Flutter AWS S3存储插件simple_s3的使用

简介

simple_s3 是一个高级且易于使用的AWS S3插件,支持文件上传和删除功能。它使用AWS原生SDK为iOS和Android提供服务。

特性

特性 描述
Null Safe
上传百分比
支持所有文件类型 自动检测文件扩展名以确定内容类型
设置访问权限 允许设置文件的访问权限(如PublicRead, Private等),默认为Public Read
时间戳 可选择在文件名中添加时间戳,默认位置为前缀
自定义文件名 允许更改上传文件的名称,必须包含扩展名
自定义S3文件夹路径 将文件上传到特定的S3文件夹
子区域支持 支持带有子区域的S3服务器进行上传/删除操作
删除对象 支持删除S3中的文件对象
自动生成URL 自动生成指向S3文件的URL

快速开始

添加依赖

pubspec.yaml中添加以下依赖:

dependencies:
  simple_s3: ^0.3.2

示例代码

以下是一个完整的示例应用,展示了如何使用simple_s3插件进行文件上传和删除操作。

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

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:simple_s3/simple_s3.dart';
// 假设Credentials.dart文件中有以下内容:
// const String s3_bucketName = "your-bucket-name";
// const String s3_poolD = "your-pool-id";

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: "S3 Upload/Delete Demo",
      home: Scaffold(body: SimpleS3Test()),
    );
  }
}

class SimpleS3Test extends StatefulWidget {
  @override
  SimpleS3TestState createState() => SimpleS3TestState();
}

class SimpleS3TestState extends State<SimpleS3Test> {
  File? selectedFile;

  SimpleS3 _simpleS3 = SimpleS3();
  bool isLoading = false;
  bool uploaded = false;

  @override
  void dispose() {
    super.dispose();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: StreamBuilder<dynamic>(
            stream: _simpleS3.getUploadPercentage,
            builder: (context, snapshot) {
              return new Text(
                snapshot.data == null ? "Simple S3 Test" : "Uploaded: ${snapshot.data}",
              );
            }),
      ),
      body: Center(
        child: selectedFile != null
            ? isLoading
                ? CircularProgressIndicator()
                : Image.file(selectedFile!)
            : GestureDetector(
                onTap: () async {
                  final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
                  if (pickedFile != null) {
                    setState(() {
                      selectedFile = File(pickedFile.path);
                    });
                  }
                },
                child: Icon(
                  Icons.add,
                  size: 30,
                ),
              ),
      ),
      floatingActionButton: !isLoading
          ? FloatingActionButton(
              backgroundColor: uploaded ? Colors.green : Colors.blue,
              child: Icon(
                uploaded ? Icons.delete : Icons.arrow_upward,
                color: Colors.white,
              ),
              onPressed: () async {
                if (uploaded) {
                  print(await SimpleS3.delete(
                      "test/${selectedFile!.path.split("/").last}", 
                      Credentials.s3_bucketName, 
                      Credentials.s3_poolD, 
                      AWSRegions.apSouth1,
                      debugLog: true));
                  setState(() {
                    selectedFile = null;
                    uploaded = false;
                  });
                }
                if (selectedFile != null) _upload();
              },
            )
          : null,
    );
  }

  Future<String?> _upload() async {
    try {
      setState(() {
        isLoading = true;
      });
      final result = await _simpleS3.uploadFile(
        selectedFile!,
        Credentials.s3_bucketName,
        Credentials.s3_poolD,
        AWSRegions.apSouth1,
        debugLog: true,
        s3FolderPath: "test",
        accessControl: S3AccessControl.publicRead,
      );

      setState(() {
        uploaded = true;
        isLoading = false;
      });

      return result;
    } catch (e) {
      print(e);
      return null;
    }
  }
}

注意事项

  • Android Release Mode:如果在Android发布模式下遇到问题,请确保在app/build.gradle中正确配置Proguard规则。具体步骤如下:

    buildTypes {
      release {
        signingConfig signingConfigs.release
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-aws-2.1.5.pro'
      }
    }
    

    并将proguard-aws-2.1.5.pro的内容复制到项目的app目录下。

通过以上步骤,您可以顺利地在Flutter项目中集成并使用simple_s3插件进行AWS S3的文件上传和删除操作。


更多关于Flutter AWS S3存储插件simple_s3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter AWS S3存储插件simple_s3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用simple_s3插件与AWS S3进行交互的示例代码。simple_s3插件允许你轻松地从Flutter应用中上传和下载文件到AWS S3。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加simple_s3依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_s3: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置AWS S3

你需要AWS S3的访问密钥(Access Key)、秘密密钥(Secret Key)、区域(Region)以及你想要操作的桶(Bucket)名称。这些敏感信息不应该硬编码在客户端应用中,而应该通过环境变量或安全的后端服务来管理。

3. 初始化并上传文件

以下是一个初始化simple_s3并上传文件的示例:

import 'package:flutter/material.dart';
import 'package:simple_s3/simple_s3.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter AWS S3 Example'),
        ),
        body: Center(
          child: UploadButton(),
        ),
      ),
    );
  }
}

class UploadButton extends StatefulWidget {
  @override
  _UploadButtonState createState() => _UploadButtonState();
}

class _UploadButtonState extends State<UploadButton> {
  final S3Client s3Client = S3Client(
    accessKey: 'YOUR_ACCESS_KEY',
    secretKey: 'YOUR_SECRET_KEY',
    region: 'YOUR_REGION',
    bucket: 'YOUR_BUCKET_NAME',
  );

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        // 选择文件
        final FilePickerResult result = await FilePicker.platform.pickFiles();
        if (result == null || result.files.isEmpty) return;

        final File file = File(result.files.first.path);

        // 上传文件
        try {
          final UploadFileResult uploadResult = await s3Client.uploadFile(
            file,
            'path/in/s3/${file.basename}', // 指定S3中的路径和文件名
          );
          print('Upload successful: ${uploadResult.url}');
        } catch (e) {
          print('Upload failed: $e');
        }
      },
      child: Text('Upload File'),
    );
  }
}

4. 下载文件

以下是一个从S3下载文件的示例:

ElevatedButton(
  onPressed: () async {
    final String remoteFilePath = 'path/in/s3/your-file.ext';
    final String localFilePath = '${(await getApplicationDocumentsDirectory()).path}/your-file.ext';

    try {
      final DownloadFileResult downloadResult = await s3Client.downloadFile(
        remoteFilePath,
        localFilePath,
      );
      print('Download successful: ${downloadResult.path}');

      // 可选:打开或展示下载的文件
      // 例如,如果它是一个图片文件,你可以使用Image.file(File(downloadResult.path))来显示它
    } catch (e) {
      print('Download failed: $e');
    }
  },
  child: Text('Download File'),
)

注意事项

  1. 安全性:永远不要在客户端代码中硬编码AWS凭证。使用AWS Cognito、环境变量或安全的后端服务来管理这些敏感信息。
  2. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,比如网络错误、文件读写错误等。
  3. 权限:确保你的AWS S3桶和对象策略正确设置,以便你的应用可以访问和修改所需的资源。

希望这些示例代码能帮助你在Flutter项目中成功使用simple_s3插件与AWS S3进行交互。

回到顶部