欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年05月21日 08:46:35   作者:陽春boy  
上傳視頻到oss,之前是走后端上傳到oss,會有一個問題就是我要先上傳給后端,后端再上傳給oss就會導致上傳多次,消耗時間過長影響用戶體驗,所以我參考文檔寫了直接上傳到阿里云oss獲取到文件訪問路徑。

代碼實現(xiàn)

以下是我寫的一個上傳oss的類,只需要替換ossAccessKeyId, ossAccessKeySecret, bucket, url, expiration這幾個參數(shù)就可以直接實現(xiàn)上傳

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';
  // 發(fā)送請求的url,根據(jù)你自己設置的是哪個城市的
  static String url = 'https://$bucket.oss-cn-hangzhou.aliyuncs.com';

  // 過期時間
  static String expiration = '2025-01-01T12:00:00.000Z';

  /**
   * @params file 要上傳的文件對象
   * @params rootDir 阿里云oss設置的根目錄文件夾名字
   * @param fileType 文件類型例如jpg,mp4等
   * @param callback 回調(diào)函數(shù)我這里用于傳cancelToken,方便后期關閉請求
   * @param onSendProgress 上傳的進度事件
   */

  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;

    //創(chuàng)建dio對象
    Dio dio = new Dio(options);
    // 生成oss的路徑和文件名我這里目前設置的是moment/20201229/test.mp4
    String pathName = '$rootDir/${getDate()}/${getRandom(12)}.${fileType == null ? getFileType(file.path) : fileType}';

    // 請求參數(shù)的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 {
      // 發(fā)送請求
      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;
  }
  /*
  * 根據(jù)圖片本地路徑獲取圖片名稱
  * */
  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;
  }
}

調(diào)用上傳的例子

其他參事自己根據(jù)自己情況上傳

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獲取到如下數(shù)據(jù)
{
        "StatusCode": 200,
          "AccessKeyId": "STS.NSsrKZes4cqm.....",
          "AccessKeySecret": "7eGnLZaEFsRCGYJAnrtdE9n.....",
          "Expiration": "2020-04-08T03:44:21Z",
          "SecurityToken": "CAISlQJ1q6Ft5B2y....."
  }
 
//表單需要的參數(shù): 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))
        //必須放在參數(shù)最后
   });
//然后通過存儲地址直接把表單(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;
  }
 
  /*
  *獲取signature簽名參數(shù)
  */
  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
  /**
   * 生成上傳上傳圖片的名稱 ,獲得的格式:photo/20171027175940_oCiobK
   * 可以定義上傳的路徑uploadPath(Oss中保存文件夾的名稱)
   * @param uploadPath 上傳的路徑 如:/photo
   * @return photo/20171027175940_oCiobK
   */
  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;
  }
 
  /*
  * 根據(jù)圖片本地路徑獲取圖片名稱
  * */
  String getImageNameByPath(String filePath) {
    // ignore: null_aware_before_operator
    return filePath?.substring(filePath?.lastIndexOf("/")+1,filePath?.length);
  }
}

以上就是flutter直接上傳文件到阿里云oss的實現(xiàn)步驟的詳細內(nèi)容,更多關于flutter 上傳文件到阿里云oss的資料請關注腳本之家其它相關文章!

相關文章

  • Android定時器實現(xiàn)定時執(zhí)行、重復執(zhí)行、定時重復執(zhí)行、定次數(shù)執(zhí)行的多種方式

    Android定時器實現(xiàn)定時執(zhí)行、重復執(zhí)行、定時重復執(zhí)行、定次數(shù)執(zhí)行的多種方式

    今天小編就為大家分享一篇關于Android定時器實現(xiàn)定時執(zhí)行、重復執(zhí)行、定時重復執(zhí)行、定次數(shù)執(zhí)行的多種方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • RxJava和Retrofit2的統(tǒng)一處理單個請求示例詳解

    RxJava和Retrofit2的統(tǒng)一處理單個請求示例詳解

    這篇文章主要給大家介紹了關于RxJava和Retrofit2的統(tǒng)一處理單個請求的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Android適配器(Adapter)的概念與自定義

    Android適配器(Adapter)的概念與自定義

    這篇文章主要給大家介紹了關于Android適配器(Adapter)的相關資料,適配器是一個非常重要的知識點,Adapter是用來幫助填出數(shù)據(jù)的中間橋梁,本文介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • Android繪制儀表盤指針刻度

    Android繪制儀表盤指針刻度

    這篇文章主要為大家詳細介紹了Android繪制儀表盤指針刻度,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android EditText輸入框?qū)崿F(xiàn)下拉且保存最近5個歷史記錄思路詳解

    Android EditText輸入框?qū)崿F(xiàn)下拉且保存最近5個歷史記錄思路詳解

    今天給大家介紹Android EditText輸入框?qū)崿F(xiàn)下拉且保存最近5個歷史記錄功能,android實現(xiàn)文本框下拉利用sharedpreferences來保存每次app啟動和關閉時已經(jīng)填寫的數(shù)值,具體代碼跟隨小編一起看看吧
    2021-07-07
  • 基于Android studio3.6的JNI教程之ncnn之語義分割ENet

    基于Android studio3.6的JNI教程之ncnn之語義分割ENet

    這篇文章主要介紹了基于Android studio3.6的JNI教程之ncnn之語義分割ENet的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2020-03-03
  • 從零開始使用gradle配置即可執(zhí)行的Hook庫詳解

    從零開始使用gradle配置即可執(zhí)行的Hook庫詳解

    這篇文章主要為大家介紹了從零開始使用gradle配置即可執(zhí)行的Hook庫詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android Fragment的具體使用方式詳解

    Android Fragment的具體使用方式詳解

    Fragment是Android3.0后引入的一個新的API,他出現(xiàn)的初衷是為了適應大屏幕的平板電腦,?當然現(xiàn)在他仍然是平板APP?UI設計的寵兒,而且我們普通手機開發(fā)也會加入這個Fragment,?我們可以把他看成一個小型的Activity,又稱Activity片段
    2022-12-12
  • Android 使用registerReceiver注冊BroadcastReceiver案例詳解

    Android 使用registerReceiver注冊BroadcastReceiver案例詳解

    這篇文章主要介紹了Android 使用registerReceiver注冊BroadcastReceiver案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Android開發(fā)之permission動態(tài)權限獲取詳解

    Android開發(fā)之permission動態(tài)權限獲取詳解

    這篇文章主要為大家詳細介紹了Android開發(fā)之permission動態(tài)權限獲取,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論