Android Java 阿里雲OSS授權訪問、訪問控制和Accesskeys 示例代碼

一、概述

阿里雲OSS的授權訪問主要分爲兩大步驟

  1. 服務端傳入endpoint、accessKeyId和accessKeySecret等參數利用SDK獲取鏈接。
  2. 客戶端向服務端請求鏈接,然後自行處理(當然也可以使用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());
        });
    }

}

三、解疑

後面補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章