這兩天用到了騰訊雲的 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終止時才真正調用刪除操作。即該方法是將刪除的命令緩存了一下,到服務停止的時候再進行操作!
上面有什么不太理解的同學可以@我,看到后一定會回復;
