一、概述
阿里雲OSS的授權訪問主要分爲兩大步驟
- 服務端傳入endpoint、accessKeyId和accessKeySecret等參數利用SDK獲取鏈接。
- 客戶端向服務端請求鏈接,然後自行處理(當然也可以使用SDK來直接下載文件)
那麼現在有幾個問題。
a)endpoint、accessKeyId和accessKeySecret分別在哪裏獲取?
字段 | 獲取 | 示例 |
---|---|---|
endpoint | 訪問域名 | http://oss-cn-shenzhen.aliyuncs.com |
accessKeyId | 進入OSS控制檯-右上角頭像-accesskeys-開始使用子用戶AccessKey(在這裏可以創建用戶,創建用戶之後進入對應的用戶詳情,最底下可以創建Accesskey,創建之後可以獲取) | LTAIbGu3gN78XXX |
accessKeySecret | 這是在創建Accesskey的時候出現的,需要及時保存下來,一旦你關閉彈窗,就無法找回了 | c0wtySPhGJSioIbI1vYXXXXXX |
bucketName | OSS控制檯創建 | tjbaobao |
objectName | 文件名稱(需要攜帶文件夾名稱) | folderName/fielName |
b) 服務端SDK怎麼下載(官方文檔)
平臺 | 連接 |
---|---|
JAVA | 直接下載 |
PHP | 通過GitHub下載 |
Python | 通過GitHub下載 |
二、實現
JAVA服務端實現
import com.aliyun.oss.OSSClient;
import java.net.URL;
import java.util.Date;
public class AliyunOSSUtil {
// Endpoint以深圳爲例,其它Region請按實際情況填寫。
private static final String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
private static final String accessKeyId = "LTAIbGu3gxxxx";
private static final String accessKeySecret = "c0wtySPhGJSioIbI1vYsxxxx";
private final static OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
public static String getUrl(String bucketName,String objectName)
{
// 設置URL過期時間爲24小時。
Date expiration = new Date(new Date().getTime() + 3600 * 1000 * 24);
// 生成以GET方法訪問的簽名URL,訪客可以直接通過瀏覽器訪問相關內容。
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
return url.toString();
}
}
Android客戶端實現
注意:我這裏使用了我框架的方法(TJFramework),有的方法你們沒有的可以根據大概意思自己寫。
/**
* 作者:TJbaobao
* 時間:2018/9/29 10:19
* 說明:
* 使用:
*/
public class AliyunOOSUtil {
private static final String BucketName = "tjbaobao";
private static final String ObjectNameHome = "TJFramework";
private static final String ServerIP = "xxxx.com:8080";
private static final String ServerUrl = "http://" + ServerIP + "/TJFramework/AliyunOSSServlet";
private static final Map<String, String> mapUrl = new HashMap<>();
private static final String AliyunUrlKey = "Aliyun_Url_Key";
//這裏應該由服務端查詢數據庫獲取,我只是依據自己的需求寫死了而已
private static final String[] objectNames = new String[]{"lakes-02_m_2.jpg","lakes-04_m_2.jpg","lakes-07_2.jpg"};
//在啓動App的時候調用
public static void init() {
initCache();
update();
}
//通過文件名獲取鏈接
@Nullable
public static String getUrl(@NonNull String name)
{
if(mapUrl.containsKey(name))
{
return mapUrl.get(name);
}
else
{
update();
}
return null;
}
//通過本地緩存來初始化鏈接緩存表
private static void initCache() {
String urlValues = (String) Tools.getSharedPreferencesValue(AliyunUrlKey, null);
if (urlValues != null) {
try {
JSONArray jsonArray = new JSONArray(urlValues);
int arraySize = jsonArray.length();
for (int i = 0; i < arraySize; i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (jsonObject != null) {
String key = jsonObject.getString("key");
String url = jsonObject.getString("url");
if (key != null && url != null) {
mapUrl.put(key, url);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
//通過聯網向服務端請求並更新鏈接緩存表
private static void update()
{
RxJavaUtil.runOnIOThread(() -> {
for(String name:objectNames)
{
String httpUrl = ServerUrl+"?bucketName="+BucketName+"&objectName="+ObjectNameHome+"/"+name;
String imageUrl = OKHttpUtil.doGet(httpUrl);
if(imageUrl!=null)
{
if(mapUrl.containsKey(name))
{
String urlCache = mapUrl.get(name);
if(!imageUrl.equals(urlCache))
{
mapUrl.put(name,imageUrl);
//刪除過期的鏈接對應的文件
String cacheFilePath = FileDownloader.getFilePath(urlCache);
FileUtil.delFileIfExists(cacheFilePath);
}
}
else
{
mapUrl.put(name,imageUrl);
}
}
}
JSONArray jsonArray = new JSONArray();
for(String key:mapUrl.keySet())
{
String url = mapUrl.get(key);
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("key",key);
jsonObject.put("url",url);
jsonArray.put(jsonObject);
} catch (JSONException e) {
e.printStackTrace();
}
}
Tools.setSharedPreferencesValue(AliyunUrlKey,jsonArray.toString());
});
}
}
三、解疑
後面補充。