騰訊雲 COS 對象存儲 簡單文件上傳筆記


這兩天用到了騰訊雲的 COS對象存儲 了(阿里雲的對象存儲叫:OSS),因此記錄一下簡單上傳的代碼,其他的代碼后續會逐步上;

COS 對象存儲 - 簡單文件上傳代碼:

1、官方文檔

  https://cloud.tencent.com/document/product/436/10199


2、SDK

<dependency>
 <groupId>com.qcloud</groupId>
 <artifactId>cos_api</artifactId>
 <version>5.6.24</version>
</dependency>

3、代碼 

我使用的是COS的本地文件上傳方式,前端傳來的文件數據是【MultipartFile】類型的,但是COS在接收本地文件上傳時接收的文件數據類型是【File】,因此需要先轉一下並生成一個臨時的本地文件(生成在服務器端),因此在上傳成功后需要刪除生成的臨時文件,所以,思路很清晰;

  第一步:創建COS連接對象並將【MultipartFile】轉化生成一個【File】類型的本地臨時文件在服務器上;

  第二步:使用COS連接對象開始上傳文件;

  第三步:關閉COS連接、刪除本地臨時文件;

代碼圍繞上面的三步如下:

public class COSUploadUtils {

    // 初始化用戶身份信息(secretId, secretKey)
    private static String SecretId = "***********";
    private static String SecretKey = "************";
    // bucket的區域
    private static String region_name = "ap-beijing";
    // bucket名
    private static String bucket_name = "****-130*****93";
    // 文件目錄
    private static String fileDir = "/***/**/";


    // 將本地文件上傳到COS
    public static String SimpleUploadFileFromLocal(MultipartFile file) {
        // 1 初始化用戶身份信息(secretId, secretKey)
        COSCredentials cred = new BasicCOSCredentials(SecretId, SecretKey);
        // 2 設置bucket的區域, COS地域的簡稱請參照 https://www.qcloud.com/document/product/436/6224
        ClientConfig clientConfig = new ClientConfig(new Region(region_name));
        // 3 生成cos客戶端
        COSClient cosclient = new COSClient(cred, clientConfig);


        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        Random random = new Random();

        String name = System.currentTimeMillis()+"";

        String key = System.currentTimeMillis()+ substring;

        File localFile = null;
        try {
            localFile = new File(key);
            InputStream inputStream = file.getInputStream();
            FileUtils.copyInputStreamToFile(inputStream, localFile);
            localFile = File.createTempFile(name, substring);
            file.transferTo(localFile);
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        PutObjectRequest putObjectRequest = new PutObjectRequest(bucket_name, fileDir+key, localFile);
        // 設置存儲類型, 默認是標准(Standard), 低頻(standard_ia)
        putObjectRequest.setStorageClass(StorageClass.Standard);
        String fileName = "";
        try {
            PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);
            // putobjectResult會返回文件的etag
            String etag = putObjectResult.getETag();
            String crc64 = putObjectResult.getCrc64Ecma();
            fileName = name+substring;
        } catch (CosServiceException e) {
            e.printStackTrace();
        } catch (CosClientException e) {
            e.printStackTrace();
        }

        // 關閉客戶端
        cosclient.shutdown();
     
        File f = new File(key);
        if(f.exists()){
            f.delete();
        }
        return fileName;
    }
}

注意事項:

  3.1、在寫代碼前首先開啟騰訊COS服務,並創建存儲桶;    

    主要的配置其實也沒什么,基本上紅框里的填上即可;   

  建議上圖中的訪問權限選擇給【公共讀私有寫】,因為如果設定私密讀的話會在后邊的文件訪問(他們官方叫:下載)有一定的影響,因為私密讀的情況下需要進行簽名參數,簽名參數中必須要有過期時間設定,存在過期時間的設定就會引發一個問題:緩存,當有了時間設定后的就無法再進行緩存了,因為每次創建一個訪問鏈接都會重新設定一個這個鏈接的超時時間,每個連接都不同,因此很難在客戶端做到緩存的操作,所以,正常情況下設定為【公共讀、私有寫】即可,當然,如果不考慮緩存的話還是【私有讀寫】更好一點,無他,安全;

  

  3.2、代碼中的COS各個配置信息含義及其獲取途徑:   

  // 初始化用戶身份信息(secretId, secretKey)
    private static String SecretId = "***********";
    private static String SecretKey = "************";

  這個盡量使用子賬號進行創建,大概的思路就是【1、創建子用戶(權限只針對COS的讀寫,不賦予任何有關權限的權限);2、在存儲桶中配置生成】

    // bucket的區域
    private static String region_name = "ap-beijing";
    // bucket名
    private static String bucket_name = "****-130*****93";
// 文件目錄
private static String fileDir = "/***/**/";

  這個是我自定義的參數,很有用,而且COS也是支持這樣弄得,主要作用其實就是在上傳文件時告訴COS這個文件放在那個文件夾下,也就是文件路徑,這個文件路徑可以不必提前創建,當你寫的路徑COS對象存儲空間中不存在時它會自動創建出來,而這個路徑的使用位置是在上面代碼中的:

PutObjectRequest putObjectRequest = new PutObjectRequest(bucket_name, fileDir+key, localFile);

這個是配置好的COS的文件上傳對象,

fileDir+key:要拆分成兩部分去看1、fileDir,文件所在存儲桶的文件路徑;2、key:文件最終存到存儲桶中的文件名稱; 

重要:在創建完存儲桶后大家需要注意一下它的安全問題,例如防盜鏈、服務端加密、容災容錯處理、權限的配置等,在此就不多贅述了;

另外,在寫demo時還發現了個小知識點:

  delete 與 deleteOnExit 的區別:

    delete : 刪除文件,一旦調用,程序立即執行刪除操作;

    deleteOnExit :存在則刪除, 它被調用時,相當於對deleteOnExit做了一個生聲明, 不會立刻執行刪除操作, 而是程序運行結束也就是JVM終止時才真正調用刪除操作。即該方法是將刪除的命令緩存了一下,到服務停止的時候再進行操作! 


 

上面有什么不太理解的同學可以@我,看到后一定會回復;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM