oss_upload.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import 'dart:convert';
  2. import 'dart:math';
  3. import 'package:crypto/crypto.dart';
  4. import 'package:liftmanager/utils/time_format.dart';
  5. /*
  6. * Oss工具类
  7. * PostObject方式上传图片官方文档:https://help.aliyun.com/document_detail/31988.html
  8. */
  9. class OssUtil {
  10. // static String accesskeyId = '******';//Bucket 拥有者的accesskeyId 。
  11. // static String accessKeySecret = '******';//Bucket 拥有者的accessKeySecret。
  12. static String accesskeyId = 'LTAI4G1iLTczu8JxM2En57gY';//临时用户的AccessKeyId,通过后台接口动态获取
  13. static String accessKeySecret = 'VHeRj3C2br87Uh447ruHsSTvYSDWeC';//临时用户的accessKeySecret,通过后台接口动态获取
  14. static String stsToken="";//临时用户鉴权Token,临时用户认证时必传,通过后台接口动态获取
  15. //验证文本域
  16. static String _policyText =
  17. '{"expiration": "2069-05-22T03:15:00.000Z","conditions": [["content-length-range", 0, 1048576000]]}';//UTC时间+8=北京时间
  18. //进行utf8编码
  19. static List<int> _policyText_utf8 = utf8.encode(_policyText);
  20. //进行base64编码
  21. static String policy= base64.encode(_policyText_utf8);
  22. //再次进行utf8编码
  23. static List<int> _policy_utf8 = utf8.encode(policy);
  24. // 工厂模式
  25. factory OssUtil() => _getInstance();
  26. static OssUtil get instance => _getInstance();
  27. static OssUtil _instance;
  28. OssUtil._internal() {
  29. }
  30. static OssUtil _getInstance() {
  31. if (_instance == null) {
  32. _instance = new OssUtil._internal();
  33. }
  34. return _instance;
  35. }
  36. /*
  37. *获取signature签名参数
  38. */
  39. String getSignature(String _accessKeySecret){
  40. //进行utf8 编码
  41. List<int> _accessKeySecret_utf8 = utf8.encode(_accessKeySecret);
  42. //通过hmac,使用sha1进行加密
  43. List<int> signature_pre = new Hmac(sha1, _accessKeySecret_utf8).convert(_policy_utf8).bytes;
  44. //最后一步,将上述所得进行base64 编码
  45. String signature = base64.encode(signature_pre);
  46. return signature;
  47. }
  48. /**
  49. * 生成上传上传图片的名称 ,获得的格式:photo/20171027175940_oCiobK
  50. * 可以定义上传的路径uploadPath(Oss中保存文件夹的名称)
  51. * @param uploadPath 上传的路径 如:/photo
  52. * @return photo/20171027175940_oCiobK
  53. */
  54. String getImageUploadName(String filePath) {
  55. String imageMame = "";
  56. int time = DateTime.now().millisecondsSinceEpoch;
  57. String nums = DateUtils.instance.getFormartData(timeSamp: time,format: "yyyy-MM-dd");
  58. String year = nums.split("-")[0];
  59. String mounth = nums.split("-")[1];
  60. String day = nums.split("-")[2];
  61. String uploadPath = "upload/" + year + "/" + mounth + "/" + day;
  62. var timestamp = new DateTime.now().millisecondsSinceEpoch;
  63. imageMame =timestamp.toString()+"_"+getRandom(6);
  64. if(uploadPath!=null&&uploadPath.isNotEmpty){
  65. imageMame=uploadPath+"/"+imageMame;
  66. }
  67. String imageType=filePath?.substring(filePath?.lastIndexOf("."),filePath?.length);
  68. return imageMame+imageType;
  69. }
  70. /*
  71. * 生成固定长度的随机字符串
  72. * */
  73. String getRandom(int num) {
  74. String alphabet = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
  75. String left = '';
  76. for (var i = 0; i < num; i++) {
  77. // right = right + (min + (Random().nextInt(max - min))).toString();
  78. left = left + alphabet[Random().nextInt(alphabet.length)];
  79. }
  80. return left;
  81. }
  82. /*
  83. * 根据图片本地路径获取图片名称
  84. * */
  85. String getImageNameByPath(String filePath) {
  86. return filePath?.substring(filePath?.lastIndexOf("/")+1,filePath?.length);
  87. }
  88. }