Flutter 는 OSS 에 사진 을 올 립 니 다.

4963 단어 Flutter
현재 아 리 는 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 = ';
//   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(,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 _policyText_utf8 = utf8.encode(_policyText);
  //  base64  
  static String policy= base64.encode(_policyText_utf8);

  //    utf8  
  // ignore: non_constant_identifier_names
  static List _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 AccessKeySecretUtf8 = utf8.encode(_accessKeySecret);
    //  hmac,  sha1    
    List 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);
  }
}

좋은 웹페이지 즐겨찾기