Flutter直傳騰訊云

前記:

????由于騰訊云此文章之時Flutter還未支持sdk上傳相關(guān)功能;因此需要使用直傳功能實現(xiàn)。

實現(xiàn)思路:

? ? 1、后臺進行直傳簽名;

????2、Flutter通過接口獲取服務(wù)端的簽名信息;

? ? 3、Flutter通過put請求上傳文件到騰訊云服務(wù)器;

具體步驟:騰訊云直傳實踐

? ? 1、服務(wù)端首先使用固定密鑰 SecretId、SecretKey 向 STS 服務(wù)獲取臨時密鑰

? ? 2、服務(wù)端通過 tmpSecretId、tmpSecretKey,以及 method、pathname 計算簽名

? ? 3、Flutter通過接口獲取服務(wù)端的簽名信息,主要是Signature 和 x-cos-security-token 字段

? ? 4、Flutter使用PutObject方式上傳到騰訊云,把獲取到的Signature 和 x-cos-security-token分別放到發(fā)請求時 header 的 authorization 和 x-cos-security-token 字段里。

前端代碼如下:

Map<String, String> headers = Map<String, String>();

headers['Authorization'] = _cosSignEntity.sign;

headers['x-cos-security-token'] = _cosSignEntity.sessionToken;

List<int> body = await file.readAsBytes();

String url = _cosSignEntity.baseUrl + "/" + file.name;

HttpItem res = await HttpManager.uploadImage(url, headers, body);

/// 上傳圖片

static Future<HttpItem> uploadImage( String url, Map<String, String> headers, dynamic body) async {

//創(chuàng)建一個HttpClient

HttpClient httpClient = new HttpClient();

//打開Http連接

HttpClientRequest request = await httpClient.putUrl(Uri.parse(url));

//設(shè)置請求頭

headers.keys.forEach((key) {

????dynamic value = headers[key];

????request.headers.add(key, value);

});

//設(shè)置請求內(nèi)容

request.add(body);

//等待連接服務(wù)器(會將請求信息發(fā)送給服務(wù)器)

HttpClientResponse response = await request.close();

//讀取響應(yīng)內(nèi)容

HttpItem item = HttpItem();

//成功獲取數(shù)據(jù)

if (response.statusCode == 200) {

????item.data = url;

????item.code = response.statusCode;

????item.message = response.reasonPhrase;

} else {

????item.data = null;

????item.code = response.statusCode;

????item.message = response.reasonPhrase;

}

//關(guān)閉client后,通過該client發(fā)起的所有請求都會中止。

httpClient.close();

return item;

}


后記:

? ? 為什么不使用dio實現(xiàn)上傳請求,因為dio對請求參數(shù)會進行相應(yīng)的轉(zhuǎn)碼處理,實踐發(fā)現(xiàn)使用dio框架上傳會讓圖片損壞無法使用。

? ?以下是dio部分源碼,可以發(fā)現(xiàn)數(shù)據(jù)會被轉(zhuǎn)換了,如果一定要使用dio可以重寫dio的transformer模塊自己判斷處理參數(shù)轉(zhuǎn)換。

?希望對你們有幫助,文章為個人的自我見解,如有錯誤,歡迎指教!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容