ALI-OSS web簽名直傳檔案解讀
阿新 • • 發佈:2018-12-31
想考慮這樣幾個問題
1、web簽名直傳與sdk提供的上傳有什麼不同?
2、web端上傳後,怎麼獲取傳輸在伺服器裡的檔案(怎麼下載)
解讀:
首先我們回顧下官方文件描述:
邏輯圖就不貼上複製了,使用這樣的上傳方式就是為了安全,服務端賬號密碼維護方便,利於前後端分離模式
要清楚的兩個邏輯點:
1、客戶端要上傳圖片時,到應用伺服器取上傳的policy及簽名。
2、客戶端拿到簽名直接上傳到OSS。
3、在控制檯中加入兩個配置:跨域設定,域名配置
廢話不多說直接上碼:
碼前說明:
BUCKET_NAME :你在伺服器中建立的儲存空間名,在它裡面就可以進行儲存了,還可以建立資料夾;
url字尾ENDPOINT:找對應自己使用的,在sdk中隨處可查
dirName:資料夾名稱,自己定義
***這是Client 例項裡面的三個引數你們都有
public static OSSClient getOSSClient() {
OSSClient ossClient = new OSSClient(ENDPOINT, ACCESS_KEY_ID,
ACCESS_KEY_SECRET);
return ossClient;
}
String host = "http://" + BUCKET_NAME + "." + "ENDPOINT";//這裡的ENDPOINT記得是去掉http://的格式。url不可能存在兩個http頭的
OSSClient ossClient = null ;
try {
ossClient = getOSSClient();
long expireTime = 30;
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
java.sql.Date expiration = new java.sql.Date(expireEndTime);
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dirName);
String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
Map<String, String> respMap = new LinkedHashMap<String, String>();//這裡主要是給前端更多的可讀寫資訊所以過分的封裝了,如果前端對你不好,就少給他幾個,讓他自己擷取去
respMap.put("accessid", ACCESS_KEY_ID);
respMap.put("policy", encodedPolicy);
respMap.put("signature", postSignature);
respMap.put("bucketName", BUCKET_NAME);
respMap.put("dir", dirName);
respMap.put("host", host);
respMap.put("expire", String.valueOf(expireEndTime / 1000));
JSONObject ja1 = JSONObject.fromObject(respMap);
System.out.println(ja1.toString());
return ja1.toString();
} catch (Exception e) {
ossClient.shutdown();
log.error("AliOSSUtil ---- >> fileUrl 下載地址異常, e = {}", e);
return null;
}
上面要注意的幾個容易寫的引數已經描述的很清楚了,接下來瘋狂的複製輸出就行了
下面是重點:
前端獲取到Map中的引數封裝web直傳程式碼,官方文件寫好了,瘋狂輸出就可以了,
前端傳輸中有個key,畫上重點,他對你很重要,我剛昨天接觸這個介面時誤以為會返回給前端個url或者其他直連方式,後來測了幾個小時無濟於事果斷想把他手裡的key用掉,接著去看自己以前寫的下載資訊。在SDK-授權訪問 中有這樣的一個方法:使用URL簽名授權訪問
你的key和你名稱空間引數放進去,瘋狂輸出吧,也可以下載回本地,本文到此結束,希望能幫助各位快速開發少走彎路。不喜勿噴謝謝