前記:
????由于騰訊云此文章之時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)換。

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