美文网首页
Flutter图片上传OSS

Flutter图片上传OSS

作者: R_Westbrook | 来源:发表于2020-04-09 16:43 被阅读0次

    目前阿里没有针对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": "7eGnLZaEFsRCGYJAnrtdE9n.....",
              "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;
      }
    
      /*
      *获取signature签名参数
      */
      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;
      }
    
      /*
      * 根据图片本地路径获取图片名称
      * */
      String getImageNameByPath(String filePath) {
        // ignore: null_aware_before_operator
        return filePath?.substring(filePath?.lastIndexOf("/")+1,filePath?.length);
      }
    }
    

    相关文章

      网友评论

          本文标题:Flutter图片上传OSS

          本文链接:https://www.haomeiwen.com/subject/ekncmhtx.html