我的编程空间,编程开发者的网络收藏夹
学习永远不晚

flutter直接上传文件到阿里云oss

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

flutter直接上传文件到阿里云oss

代码实现

以下是我写的一个上传oss的类,只需要替换ossAccessKeyId, ossAccessKeySecret, bucket, url, expiration这几个参数就可以直接实现上传


import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:crypto/crypto.dart';
import 'package:dio/dio.dart';

class UploadOss {

  static String ossAccessKeyId = 'ossAccessKeyId';

  static String ossAccessKeySecret = 'ossAccessKeySecret';
  // oss设置的bucket的名字
  static String bucket = 'bucketName';
  // 发送请求的url,根据你自己设置的是哪个城市的
  static String url = 'https://$bucket.oss-cn-hangzhou.aliyuncs.com';

  // 过期时间
  static String expiration = '2025-01-01T12:00:00.000Z';

  

  static Future<String> upload({ File file , String rootDir = 'moment', String fileType, Function callback, Function onSendProgress}) async {
    String policyText = '{"expiration": "$expiration","conditions": [{"bucket": "$bucket" },["content-length-range", 0, 1048576000]]}';

    // 获取签名
    String signature = getSignature(policyText);

    BaseOptions options = new BaseOptions();
    options.responseType = ResponseType.plain;

    //创建dio对象
    Dio dio = new Dio(options);
    // 生成oss的路径和文件名我这里目前设置的是moment/20201229/test.mp4
    String pathName = '$rootDir/${getDate()}/${getRandom(12)}.${fileType == null ? getFileType(file.path) : fileType}';

    // 请求参数的form对象
    FormData data = new FormData.fromMap({
      'key': pathName,
      'policy': getSplicyBase64(policyText),
      'OSSAccessKeyId': ossAccessKeyId,
      'success_action_status': '200', //让服务端返回200,不然,默认会返回204
      'signature': signature,
      'contentType': 'multipart/form-data',
      'file': MultipartFile.fromFileSync(file.path),
    });

    Response response;
    CancelToken uploadCancelToken = CancelToken();
    callback ?? callback(uploadCancelToken);

    try {
      // 发送请求
      response = await dio.post(url, data: data, cancelToken: uploadCancelToken, onSendProgress: (int count, int data) {
        onSendProgress(count, data);
      });
      // 成功后返回文件访问路径
      return '$url/$pathName';
    } catch(e) {
      throw(e.message);
    }

  }


  
  static String getRandom(int num) {
    String alphabet = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
    String left = '';
    for (var i = 0; i < num; i++) {
//    right = right + (min + (Random().nextInt(max - min))).toString();
      left = left + alphabet[Random().nextInt(alphabet.length)];
    }
    return left;
  }
  
  static String getImageNameByPath(String filePath) {
    // ignore: null_aware_before_operator
    return filePath?.substring(filePath?.lastIndexOf("/")+1,filePath?.length);
  }
  
  static String getFileType(String path) {
    print(path);
    List<String> array = path.split('.');
    return array[array.length -1];
  }
  /// 获取日期
  static String getDate() {
    DateTime now = DateTime.now();
    return '${now.year}${now.month}${now.day}';
  }

  // 获取plice的base64
  static getSplicyBase64(String policyText) {
    //进行utf8编码
    List<int> policyText_utf8 = utf8.encode(policyText);
    //进行base64编码
    String policy_base64 = base64.encode(policyText_utf8);
    return policy_base64;
  }

  /// 获取签名
  static String getSignature(String policyText) {
    //进行utf8编码
    List<int> policyText_utf8 = utf8.encode(policyText);
    //进行base64编码
    String policy_base64 = base64.encode(policyText_utf8);
    //再次进行utf8编码
    List<int> policy = utf8.encode(policy_base64);
    //进行utf8 编码
    List<int> key = utf8.encode(ossAccessKeySecret);
    //通过hmac,使用sha1进行加密
    List<int> signature_pre = Hmac(sha1, key).convert(policy).bytes;
    //最后一步,将上述所得进行base64 编码
    String signature = base64.encode(signature_pre);
    return signature;
  }
}

调用上传的例子

其他参事自己根据自己情况上传


Future<String> uploadFile(File file, { Function onSendProgress, Function callback}) async {
  final String url = await UploadOss.upload(file: file, onSendProgress: onSendProgress, callback: callback);
  return url;
}

另一种方法

目前阿里没有针对Flutter有官方SDK可集成, 但是有人对Flutter的上传有封装库https://pub.dev/packages/aly_oss#-example-tab-, 所以我们只能通过post提交PostObject的形式来上传;

准备工作:

1、获取OSS凭证地址(your oss_sts_server), 通知get直接获取static String ossServerUrl = 'http://.../sts-server/sts.php';

2、上传的存储地址(桶名):static String ossEndPointCdn = '<your endpointcdn>';


// 通过ossServerUrl直接get获取到如下数据
{
        "StatusCode": 200,
          "AccessKeyId": "STS.NSsrKZes4cqm.....",
          "AccessKeySecret": "7eGnLZaEFclass="lazy" data-srcGYJAnrtdE9n.....",
          "Expiration": "2020-04-08T03:44:21Z",
          "SecurityToken": "CAISlQJ1q6Ft5B2y....."
  }
 
//表单需要的参数: AccessKeyId、AccessKeySecret、SecurityToken;
FormData formdata = new FormData.from({
        //文件名,随意
        'Filename': OssUtil.instance.getImageName(filePath),
        //"可以填写文件夹名(对应于oss服务中的文件夹)/" + fileName
        'key': uploadName,//上传后的文件名
        'policy': OssUtil.policy,
        //Bucket 拥有者的AccessKeyId。
        'OSSAccessKeyId': data['AccessKeyId'],
        //让服务端返回200,不然,默认会返回204
        'success_action_status': '200',
        'signature': OssUtil.instance.getSignature(data['AccessKeySecret']),
        //临时用户授权时必须,需要携带后台返回的security-token
        'x-oss-security-token': data['SecurityToken'],
        'file': new UploadFileInfo(
            file, OssUtil.instance.getImageNameByPath(filePath))
        //必须放在参数最后
   });
//然后通过存储地址直接把表单(formdata)上传上去;
Dio dio=Dio();
dio.options.responseType=ResponseType.plain;
Response response=awaitdio.post(<ossEndPointCdn>,data:formData);
......

tips: 上传成功后图片地址 imageUrl = ossEndPointCdn + '/' + uploadName;

给一个工具类


import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'dart:math';
 
class OssUtil {
 获取
  //验证文本域
  static String _policyText =
      '{"expiration": "2069-05-22T03:15:00.000Z","conditions": [["content-length-range", 0, 1048576000]]}';//UTC时间+8=北京时间
 
  //进行utf8编码
  // ignore: non_constant_identifier_names
  static List<int> _policyText_utf8 = utf8.encode(_policyText);
  //进行base64编码
  static String policy= base64.encode(_policyText_utf8);
 
  //再次进行utf8编码
  // ignore: non_constant_identifier_names
  static List<int> _policy_utf8 = utf8.encode(policy);
 
  // 工厂模式
  factory OssUtil() => _getInstance();
 
  static OssUtil get instance => _getInstance();
  static OssUtil _instance;
 
  OssUtil._internal();
 
  static OssUtil _getInstance() {
    if (_instance == null) {
      _instance = new OssUtil._internal();
    }
    return _instance;
  }
 
  
  String getSignature(String _accessKeySecret){
    //进行utf8 编码
    // ignore: non_constant_identifier_names
    List<int> AccessKeySecretUtf8 = utf8.encode(_accessKeySecret);
    //通过hmac,使用sha1进行加密
    List<int> signaturePre = new Hmac(sha1, AccessKeySecretUtf8).convert(_policy_utf8).bytes;
    //最后一步,将上述所得进行base64 编码
    String signature = base64.encode(signaturePre);
    return signature;
  }
 
  // ignore: slash_for_doc_comments
  
  String getImageUploadName(String uploadPath,String filePath) {
    String imageMame = "";
    var timestamp = new DateTime.now().millisecondsSinceEpoch;
    imageMame =timestamp.toString()+"_"+getRandom(6);
    if(uploadPath!=null&&uploadPath.isNotEmpty){
      imageMame=uploadPath+"/"+imageMame;
    }
    String imageType=filePath?.substring(filePath?.lastIndexOf("."),filePath?.length);
    return imageMame+imageType;
  }
 
  String getImageName(String filePath) {
    String imageMame = "";
    var timestamp = new DateTime.now().millisecondsSinceEpoch;
    imageMame =timestamp.toString()+"_"+getRandom(6);
    String imageType=filePath?.substring(filePath?.lastIndexOf("."),filePath?.length);
    return imageMame+imageType;
  }
 
  
  String getRandom(int num) {
    String alphabet = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
    String left = '';
    for (var i = 0; i < num; i++) {
//    right = right + (min + (Random().nextInt(max - min))).toString();
      left = left + alphabet[Random().nextInt(alphabet.length)];
    }
    return left;
  }
 
  
  String getImageNameByPath(String filePath) {
    // ignore: null_aware_before_operator
    return filePath?.substring(filePath?.lastIndexOf("/")+1,filePath?.length);
  }
}

以上就是flutter直接上传文件到阿里云oss的实现步骤的详细内容,更多关于flutter 上传文件到阿里云oss的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

flutter直接上传文件到阿里云oss

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

阿里云OSS如何将文件传输到服务器?

阿里云对象存储服务(ObjectStorageService,简称OSS)是一种高可用、高可靠、低成本的云存储服务,可以用于存储和管理各种类型的数据。在使用OSS时,我们常常需要将文件从OSS传输到服务器上进行处理。本文将介绍如何使用阿里云OSS将文件传输到服务器。步骤一:创建OSSBucket首先,我们需要在阿里云O
阿里云OSS如何将文件传输到服务器?
2024-01-30

阿里云OSS文件传输到本地服务器的详细步骤

阿里云OSS是阿里云提供的一项云存储服务,用户可以通过该服务将文件上传至云端,方便地在不同设备或服务器之间进行文件传输。本文将详细介绍如何将阿里云OSS上的文件传输到本地服务器。一、准备工作创建阿里云账号并购买OSS服务:首先,你需要在阿里云官网上注册账号,然后购买OSS服务。在购买服务后,阿里云会为你提供一个专
阿里云OSS文件传输到本地服务器的详细步骤
2023-11-20

阿里云:如何上传文件到服务器

简介阿里云是中国领先的云计算服务提供商之一,提供了丰富的云产品和服务,其中包括云服务器(ECS)等。在使用阿里云的云服务器时,我们需要将文件上传到服务器上,以便进行后续的操作和管理。本文将介绍如何在阿里云上上传文件到服务器。步骤一:登录阿里云控制台首先,打开浏览器,访问阿里云官方网站,并使用您的账号登录阿里云控制台。如
阿里云:如何上传文件到服务器
2024-01-30

阿里云如何将文件上传到服务器

本文将介绍如何使用阿里云提供的服务,将本地文件上传到服务器,以便在服务器上进行进一步的操作和管理。阿里云作为全球领先的云计算服务提供商,为用户提供了多种方便快捷的方法来上传文件到服务器。以下是几种常见的方法:1.使用阿里云对象存储(OSS)阿里云对象存储(OSS)是一种高可用、安全、低成本的对象存储服务,可用于存
阿里云如何将文件上传到服务器
2024-01-01

传文件到阿里云服务器

1.登录到阿里云服务器首先,你需要登录到你的阿里云服务器。你可以使用SSH客户端,如PuTTY(Windows)或Terminal(Mac/Linux),通过输入服务器的IP地址和登录凭证来连接到服务器。2.上传文件到服务器一旦你成功登录到服务器,你可以使用以下命令将文件从本地计算机上传到服务器:scp/path/to
2023-10-27

如何将EA文件上传到阿里云服务器

简介:EA文件是一种常用的文件格式,在各种应用程序中广泛使用。但是,将EA文件上传到阿里云服务器可能会遇到一些问题。本文将介绍如何将EA文件上传到阿里云服务器,并提供一些实用的技巧和建议。上传EA文件到阿里云服务器的方法:使用FTP客户端上传EA文件可以通过FTP客户端来上传到阿里云服务器。首先,您需要下载并安装一个支
如何将EA文件上传到阿里云服务器
2023-12-26

使用 REST API 将文件直接上传到 Google 存储桶

问题内容按照 go 示例,我使用以下代码将文件上传到 google 存储桶:func uploadFile(bucket string, uploadFilePath string, destFilePath string) error
使用 REST API 将文件直接上传到 Google 存储桶
2024-02-06

如何用FTP上传文件到阿里云服务器

在进行网站开发或者文件传输时,FTP(文件传输协议)是一个非常重要的工具。尤其在阿里云服务器上,使用FTP上传文件更是必不可少的操作。本文将详细介绍如何用FTP上传文件到阿里云服务器。步骤一:连接阿里云服务器首先,你需要通过阿里云的控制台或者其他方式连接到你的阿里云服务器。在连接过程中,你需要输入你的用户名和密码
如何用FTP上传文件到阿里云服务器
2023-11-17

文件上传至阿里云服务器上

简介在现代互联网时代,文件上传至云服务器已经成为了常见的操作。阿里云作为国内领先的云计算服务提供商,提供了丰富的云服务器产品,其中包括了文件上传的功能。本文将介绍如何将文件上传至阿里云服务器上,并提供一些实际操作的示例。步骤一:创建云服务器实例首先,您需要在阿里云控制台上创建一个云服务器实例。选择适合您需求的实例类型和
文件上传至阿里云服务器上
2024-01-29

阿里云OSS文件拷贝到服务器的详细步骤

阿里云OSS是阿里云提供的一项云存储服务,具有安全可靠、低成本、高扩展性等特点。如果需要将阿里云OSS上的文件拷贝到服务器,可以参考以下详细步骤。详细说明:1.首先,你需要在阿里云的控制台中创建一个OSS存储空间,并将文件上传到这个存储空间中。然后,你需要获取到OSS存储空间的URL。在阿里云的控制台中,点击存储
阿里云OSS文件拷贝到服务器的详细步骤
2023-10-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录