flutter使用騰訊云COS對象服務

官方文檔:請求簽名, Get Object

轉載請注明出處: http://www.reibang.com/p/49fe86909d18

Overview

本文使用dart按照騰訊COS文檔生成簽名齐疙,并使用簽名下載COS文件對象到本地(使用flutter_download包)

載入crypto以及flutter_downloader包

pubspec.yaml文件中加入依賴(flutter_downloader文檔,crypto文檔

Android: flutter_downloader 需要配置權限,請參考其文檔递宅。

dependencies:
  flutter:
    sdk: flutter
    ........
  crypto: ^2.0.6
  flutter_downloader: ^1.1.3

實現(xiàn)cos簽名以及下載文件

import 'dart:convert';

import 'package:crypto/crypto.dart';
import 'package:flutter_downloader/flutter_downloader.dart';

class TencentCos {
  static bool debug = true;
  /// auth signature expired time in seconds
  static final int signExpireTimeInSeconds = '10';

  static final String secretId = 'tencentSerertId';
  static final String secretKey = 'tencentSecretKey';
  static final String bucketHost = 'yourBucketHost'; // xxx-xxxxxx.cos.ap-chengdu.myqcloud.com

  static TencentCos _cos;

  TencentCos._();

  static TencentCos get() {
    if (_cos == null) {
      _cos = TencentCos._();
    }

    return _cos;
  }

 /// download $fileName and save to $saveDir(absolute path)
  Future<String> downloadFile(String fileName, String saveDir) async {
    var url = '/$fileName';
    final taskId = await FlutterDownloader.enqueue(
      headers: buildHeaders(url),
      url: 'https://$bucketHost$url',
      savedDir: saveDir,
      fileName: fileName,
      showNotification: false,
      // show download progress in status bar (for Android)
      openFileFromNotification: false,
      // click on notification to open downloaded file (for Android)
    );
    return taskId;
  }

  Map<String, String> buildHeaders(String url) {
    Map<String, String> headers = Map();
    headers['HOST'] = bucketHost;
    headers['Authorization'] = _auth('get', url, headers: headers);
    if(debug) {
      print(headers);
    }
    return headers;
  }

  String _auth(String httpMethod, String httpUrl,
  {Map<String, String> headers, Map<String, String> params}) {
    headers = headers ?? Map();
    params = params ?? Map();

    int currentTimestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;
    var keyTime =
        '$currentTimestamp;${currentTimestamp + signExpireTimeInSeconds}';
    headers = headers.map((key, value) => MapEntry(key.toLowerCase(), value));
    params = params.map((key, value) => MapEntry(key.toLowerCase(), value));
    List<String> headerKeys = headers.keys.toList();
    headerKeys.sort();
    var headerList = headerKeys.join(';');
    var httpHeaders = headerKeys
        .map((item) => '$item=${Uri.encodeFull(headers[item])}')
        .join('&');

    List<String> paramKeys = params.keys.toList();
    paramKeys.sort();
    var urlParamList = paramKeys.join(';');
    var httpParameters = paramKeys
        .map((item) => '$item=${Uri.encodeFull(params[item])}')
        .join('&');

    var signKey = new Hmac(sha1, utf8.encode(secretKey))
        .convert(utf8.encode(keyTime));
    String httpString =
        '${httpMethod.toLowerCase()}\n$httpUrl\n$httpParameters\n$httpHeaders\n';
    var httpStringData = sha1.convert(utf8.encode(httpString));
    String stringToSign = 'sha1\n$keyTime\n$httpStringData\n';
    var signature =
        new Hmac(sha1, utf8.encode(signKey.toString())).convert(utf8.encode(stringToSign));

    String auth =
        'q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$keyTime&q-key-time=$keyTime&q-header-list=$headerList&q-url-param-list=$urlParamList&q-signature=$signature';
    return auth;
  }
}

使用示例

static final TencentCos _cos = TencentCos.get();

 Future<String> _findLocalPath() async {
    final directory = widget.platform == TargetPlatform.android
        ? await getExternalStorageDirectory()
        : await getApplicationDocumentsDirectory();
    return directory.path;
  }

Future _requestDownload() async {
    ///  $yourLocalSaveDir is relative path
     var _localPath = (await _findLocalPath()) + '$yourLocalSaveDir';  
     var taskId = await _cos.downloadFile('$yourFileNameInCos', _localPath);
  }

更多

可根據(jù)自己需求这难,使用buildHeaders生成帶簽名的請求頭毡鉴,進行https請求敢靡。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末畸冲,一起剝皮案震驚了整個濱河市财异,隨后出現(xiàn)的幾起案子毒嫡,更是在濱河造成了極大的恐慌癌蚁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兜畸,死亡現(xiàn)場離奇詭異努释,居然都是意外死亡,警方通過查閱死者的電腦和手機咬摇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門伐蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肛鹏,你說我怎么就攤上這事逸邦《髋妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵缕减,是天一觀的道長雷客。 經(jīng)常有香客問我,道長桥狡,這世上最難降的妖魔是什么搅裙? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮裹芝,結果婚禮上部逮,老公的妹妹穿的比我還像新娘。我一直安慰自己局雄,他們只是感情好甥啄,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布存炮。 她就那樣靜靜地躺著炬搭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穆桂。 梳的紋絲不亂的頭發(fā)上宫盔,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音享完,去河邊找鬼灼芭。 笑死,一個胖子當著我的面吹牛般又,可吹牛的內容都是我干的彼绷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茴迁,長吁一口氣:“原來是場噩夢啊……” “哼寄悯!你這毒婦竟也來了?” 一聲冷哼從身側響起堕义,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猜旬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后倦卖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洒擦,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年怕膛,在試婚紗的時候發(fā)現(xiàn)自己被綠了熟嫩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐捻,死狀恐怖掸茅,靈堂內的尸體忽然破棺而出洋侨,到底是詐尸還是另有隱情,我是刑警寧澤倦蚪,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布希坚,位于F島的核電站,受9級特大地震影響陵且,放射性物質發(fā)生泄漏裁僧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一慕购、第九天 我趴在偏房一處隱蔽的房頂上張望聊疲。 院中可真熱鬧,春花似錦沪悲、人聲如沸获洲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贡珊。三九已至,卻和暖如春涉馁,著一層夾襖步出監(jiān)牢的瞬間门岔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工烤送, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寒随,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓帮坚,卻偏偏與公主長得像妻往,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子试和,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容