阿里云OSS上传、下载、STS授权(Java篇)
生活随笔
收集整理的這篇文章主要介紹了
阿里云OSS上传、下载、STS授权(Java篇)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
聲明:步驟比較長,如果你已經(jīng)配置好OSS,直接拉到最后代碼實現(xiàn)部分
1.申請oss,創(chuàng)建一個Bucket。
1)創(chuàng)建Bucket
2)紅框內(nèi)容建議選項,其余的隨意
3)創(chuàng)建完成找到Bucket列表,選擇剛創(chuàng)建的Bucket
4)綁定自己的域名(這一步可選,為了后期訪問資源路徑的統(tǒng)一性,記得打開CNANE選項)
2.創(chuàng)建RAM角色
1) 斷點續(xù)傳上傳阿里云文檔說明https://help.aliyun.com/document_detail/84785.html?spm=a2c4g.11186623.6.952.173c6d13b2BNrI
不過在這之前,我們的文件是以私有的方式訪問的,所以在上傳之前,先做STS臨時訪問權(quán)限的設(shè)置,當然你也可以選擇公開,但建議最好選擇私有
2)授權(quán)訪問阿里云文檔說明https://help.aliyun.com/document_detail/32016.html?spm=a2c4g.11186623.6.998.7ccb5d88coP9DG
授權(quán)的方式有兩種,STS和URL兩種方式,這里選擇STS方式
3)在授權(quán)之前,我們先獲取到STS臨時訪問憑證訪問OSS
4)首先創(chuàng)建一個RAM用戶(點擊RAM控制臺)
5)創(chuàng)建RAM
6)名稱隨意,但需要把Open API 調(diào)用訪問勾選上
7)創(chuàng)建AccessKeyId(一個用戶最多擁有兩個AccessKeyId)
8)為RAM用戶授予請求AssumeRole的權(quán)限
9)創(chuàng)建用于獲取臨時訪問憑證的角色
10)直接選擇下一步
11)名稱隨意
12)創(chuàng)建完成之后,添加權(quán)限
AliyunOSSFullAccess對OSS全部操作權(quán)限
AliyunSTSAssumeRoleAccess調(diào)用STS服務(wù)AssumeRole接口的權(quán)限
AliyunUserOSS自定義策略權(quán)限
13)AliyunUserOSS配置,如果你不知道在寫,就按照我的方式去配置
{"Version": "1","Statement": [{"Effect": "Allow","Action": "oss:*","Resource": ["acs:oss:*:*:*"]}] }14)這一步就使用我們創(chuàng)建好的AliyunUserOSS配置
15)這步下面有代碼不要急
16)這一步下面有代碼,不要急
3.使用STS進行臨時授權(quán)
1)添加依賴
java version>8
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version> </dependency> <dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version> </dependency> <!-- no more than 2.3.3--> <dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version> </dependency>java version <=8
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version> </dependency>再添加lombok構(gòu)造器注解依賴
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency>重點來了,前面都是步驟,這里直接結(jié)合前面的步驟,代碼實現(xiàn)
2)MD5Util.java用于加密文件名
import java.security.MessageDigest;/*** MD5加密工具類*/ public class MD5Util {/**** MD5加碼 生成32位md5碼*/public static String getEncryptedPwd32(String inStr) {MessageDigest md5 = null;try {md5 = MessageDigest.getInstance("MD5");} catch (Exception e) {System.out.println(e.toString());e.printStackTrace();return "";}char[] charArray = inStr.toCharArray();byte[] byteArray = new byte[charArray.length];for (int i = 0; i < charArray.length; i++) byteArray[i] =(byte) charArray[i];byte[] md5Bytes = md5.digest(byteArray);StringBuffer hexValue = new StringBuffer();for (int i = 0; i < md5Bytes.length; i++) {int val = ((int) md5Bytes[i]) & 0xff;if (val < 16) hexValue.append("0");hexValue.append(Integer.toHexString(val));}return hexValue.toString();}3)AliyunOSSFileConfig.java用于文件屬性配置
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class AliyunOSSFileConfig {private String fileName;private String fileDir;private String fileType;public AliyunOSSFileConfig(String fileDir, String fileType) {this.fileDir = fileDir;this.fileType = fileType;}public AliyunOSSFileConfig(String fileName) {this.fileName = fileName;} }4)AliyunOSSConfig.java阿里云OSS配置
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class AliyunOSSConfig {/*** oss 訪問地址*/private String ossEndpoint = "步驟1.4創(chuàng)建的域名";/*** sts訪問地址*/private String stsEndpoint = "sts.cn-beijing.aliyuncs.com";/*** 請求標記符*/private String requestId;/*** 安全令牌*/private String securityToken;/*** 臨時訪問accessKeyId*/private String accessKeyId = "步驟2.7創(chuàng)建的AccessKeyId";/*** 臨時訪問Secret*/private String accessKeySecret = "步驟2.7創(chuàng)建的AccessKeySecret";/*** 有效時長(一天)*/private long expiration = 3600L;/*** 角色ARN*/private String roleArn = "復(fù)制步驟2.9的ARN值";/*** 自定義角色會話名稱,用來區(qū)分不同的令牌,例如可填寫為SessionTest。*/private String roleSessionName = "英文字母隨意";/*** oss bucket 名稱*/private String bucketName = "步驟1創(chuàng)建的Bucket";public AliyunOSSConfig(String accessKeyId,String accessKeySecret,String requestId,String securityToken) {this.accessKeyId = accessKeyId;this.accessKeySecret = accessKeySecret;this.requestId = requestId;this.securityToken = securityToken;} }5)AliyunOSSUtils.java阿里云OSS上傳,下載,STS,封裝(步驟2.15,2.16的實現(xiàn)代碼)
import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.DownloadFileRequest; import com.aliyun.oss.model.DownloadFileResult; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.UploadFileRequest; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.auth.sts.AssumeRoleRequest; import com.aliyuncs.auth.sts.AssumeRoleResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;public class AliyunOSSUtils {/*** 實例化一個對象*/private static AliyunOSSUtils instance;/*** oss參數(shù)配置*/private static AliyunOSSConfig mConfig = new AliyunOSSConfig();/*** 創(chuàng)建一個實例* @return*/public static AliyunOSSUtils getInstance() {if (instance == null) {instance = new AliyunOSSUtils();}return instance;}/*** 初始化oss配置* @param accessKeyId* @param accessKeySecret* @return* @throws Exception*/public AliyunOSSUtils initConfig(AliyunOSSConfig config) throws Exception {if (instance == null) {throw new RuntimeException("請先調(diào)用getInstance來獲取一個實例對象");}mConfig = config;return instance;}/*** 單文件上傳* @param fileName* @return* @throws Throwable*/public URL upload(AliyunOSSFileConfig fileConfig) {OSS ossClient = null;String oldFileName = fileConfig.getFileName();String fileDir = createFileDir(oldFileName);String fileName = createFileName(oldFileName);try {ossClient = getOSSClient();UploadFileRequest uploadFileRequest = getUploadFileRequest(mConfig.getBucketName(),oldFileName,fileDir + fileName);ossClient.uploadFile(uploadFileRequest);} catch (Throwable e) {e.printStackTrace();} finally {// 關(guān)閉OSSClient。ossClient.shutdown();}return getOSSFileUrl(ossClient, fileDir + fileName);}/*** 多個文件上傳* @param file* @return* @throws Throwable*/public List<URL> uploadMultipleFile(List<AliyunOSSFileConfig> list)throws Throwable {List<URL> urls = new ArrayList<>();OSS ossClient = getOSSClient();list.forEach(item -> {try {String oldFileName = item.getFileName();String fileDir = createFileDir(oldFileName);String fileName = createFileName(oldFileName);UploadFileRequest uploadFileRequest = getUploadFileRequest(mConfig.getBucketName(),oldFileName,fileDir + fileName);//上傳文件ossClient.uploadFile(uploadFileRequest);urls.add(getOSSFileUrl(ossClient, fileDir + fileName));} catch (Throwable e) {e.printStackTrace();// 關(guān)閉OSSClient。ossClient.shutdown();}});// 關(guān)閉OSSClient。ossClient.shutdown();return urls;}/*** 文件下載* @param fileName* @throws Throwable*/public void download(String fileName, String dir) throws Throwable {if (fileName == null || fileName.isEmpty() || dir == null || dir.isEmpty()) {throw new RuntimeException("請選擇文件和儲存路徑");}// 創(chuàng)建OSSClient實例。OSS ossClient = getOSSClient();// 下載請求,10個任務(wù)并發(fā)下載,啟動斷點續(xù)傳。DownloadFileRequest downloadFileRequest = new DownloadFileRequest(mConfig.getBucketName(),fileName);//文件后綴名String newFileName = createFileName(fileName);downloadFileRequest.setDownloadFile(dir + newFileName);downloadFileRequest.setPartSize(1 * 1024 * 1024);downloadFileRequest.setTaskNum(10);downloadFileRequest.setEnableCheckpoint(true);downloadFileRequest.setCheckpointFile("DownloadCheckpointFile");// 下載文件。DownloadFileResult downloadRes = ossClient.downloadFile(downloadFileRequest);// 下載成功時,會返回文件元信息。downloadRes.getObjectMetadata();// 關(guān)閉OSSClient。ossClient.shutdown();}/**** @param endpoint STS接入地址 例如sts.cn-hangzhou.aliyuncs.com* @param roleArn 角色ARN。* @param roleSessionName 自定義角色會話名稱,用來區(qū)分不同的令牌* @param accessKeyId 子賬號accessKeyId* @param accessKeySecret 子賬號accessKeySecret* @return*/public AliyunOSSConfig getAssumeRole(String endpoint,String roleArn,String roleSessionName,String accessKeyId,String accessKeySecret) {try {// 添加endpoint。DefaultProfile.addEndpoint("", "", "Sts", endpoint);// 構(gòu)造default profile。IClientProfile profile = DefaultProfile.getProfile("",accessKeyId,accessKeySecret);// 構(gòu)造client。DefaultAcsClient client = new DefaultAcsClient(profile);final AssumeRoleRequest request = new AssumeRoleRequest();request.setMethod(MethodType.POST);request.setRoleArn(roleArn);request.setRoleSessionName(roleSessionName);request.setDurationSeconds(mConfig.getExpiration()); // 設(shè)置臨時訪問憑證的有效時間為3600秒。final AssumeRoleResponse response = client.getAcsResponse(request);//請求識別符號String requestId = response.getRequestId();//臨時accessKeyIdString tempAccessKeyId = response.getCredentials().getAccessKeyId();//臨時accessKeySecretString tempAccessKeySecret = response.getCredentials().getAccessKeySecret();//安全令牌String securityToken = response.getCredentials().getSecurityToken();return new AliyunOSSConfig(tempAccessKeyId,tempAccessKeySecret,requestId,securityToken);} catch (ClientException e) {System.out.println("Failed:");System.out.println("Error code: " + e.getErrCode());System.out.println("Error message: " + e.getErrMsg());System.out.println("RequestId: " + e.getRequestId());return null;}}/*** 獲取上傳后返回oss文件路徑* @param oss 阿里云OSS* @param fileName 文件* @return*/private URL getOSSFileUrl(OSS oss, String fileName) {//返回鏈接URL url = oss.generatePresignedUrl(mConfig.getBucketName(),fileName,new Date(new Date().getTime() + mConfig.getExpiration() * 1000));// System.out.println("url====" + url);return url;}/*** 獲取阿里云OSS* @param fileName 文件* @param securityToken 阿里云sts驗證* @return* @throws Throwable*/private OSS getOSSClient() throws Throwable {OSS ossClient = null;if (ossClient == null) {//設(shè)置ossClient配置ClientBuilderConfiguration clientConfig = new ClientBuilderConfiguration();//開啟自定義域名clientConfig.setSupportCname(true);//獲取臨時憑證AliyunOSSConfig assumeRole = getAssumeRole(mConfig.getStsEndpoint(),mConfig.getRoleArn(),mConfig.getRoleSessionName(),mConfig.getAccessKeyId(),mConfig.getAccessKeySecret());System.out.println(assumeRole);ossClient =new OSSClientBuilder().build(assumeRole.getOssEndpoint(),assumeRole.getAccessKeyId(),assumeRole.getAccessKeySecret(),assumeRole.getSecurityToken(),clientConfig);}return ossClient;}/*** 獲取oss文件上傳工具* @param bucketName* @param fileName* @return*/private UploadFileRequest getUploadFileRequest(String bucketName,String oldFileName,String fileName) {UploadFileRequest uploadFileRequest = null;if (uploadFileRequest == null) {ObjectMetadata meta = new ObjectMetadata();AliyunOSSFileConfig fileConfig = getContentType(oldFileName);meta.setContentType(fileConfig.getFileType());uploadFileRequest = new UploadFileRequest(bucketName, fileName);// 填寫本地文件的完整路徑。如果未指定本地路徑,則默認從示例程序所屬項目對應(yīng)本地路徑中上傳文件。uploadFileRequest.setUploadFile(oldFileName);// 指定上傳并發(fā)線程數(shù),默認值為1。uploadFileRequest.setTaskNum(5);// 指定上傳的分片大小。uploadFileRequest.setPartSize(1 * 1024 * 1024);// 開啟斷點續(xù)傳,默認關(guān)閉。uploadFileRequest.setEnableCheckpoint(true);// 記錄本地分片上傳結(jié)果的文件。上傳過程中的進度信息會保存在該文件中。uploadFileRequest.setCheckpointFile("UploadCheckpointFile");// 文件的元數(shù)據(jù)。uploadFileRequest.setObjectMetadata(meta);}return uploadFileRequest;}/*** 獲取臨時文件資源路徑* @param fileName (目錄+文件名稱 例:image/2021-08-05/126cb28e1f9422a4410a6b76bda28be6.jpg)* @return* @throws Throwable*/public String getFileUrl(String fileName) throws Throwable {URL url = getOSSFileUrl(getOSSClient(), fileName);String path = url.toString();return path;}/*** 通過文件名判斷并獲取OSS服務(wù)文件上傳時文件的contentType*/private static AliyunOSSFileConfig getContentType(String fileName) {String fileExtension = getSuffix(fileName);if (".bmp".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("image/", "image/bmp");}if (".gif".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("image/", "image/gif");}if (".jpeg".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("image/", "image/jpeg");}if (".jpg".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("image/", "image/jpg");}if (".png".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("image/", "image/png");}if (".html".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("txt/", "text/html");}if (".txt".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("txt/", "text/plain");}if (".vsd".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("doc/", "application/vnd.visio");}if (".ppt".equalsIgnoreCase(fileExtension) ||"pptx".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("doc/", "application/vnd.ms-powerpoint");}if (".doc".equalsIgnoreCase(fileExtension) ||"docx".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("doc/", "application/msword");}if (".xml".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("doc/", "text/xml");}if (".mp4".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("video/", "video/mp4");}if (".mp3".equalsIgnoreCase(fileExtension)) {return new AliyunOSSFileConfig("audio/", "audio/mp3");}return new AliyunOSSFileConfig("other/", "text/html");}/*** 獲取文件后綴名* @param fileName* @return*/private static String getSuffix(String fileName) {if (fileName != null && !fileName.isEmpty()) {return fileName.substring(fileName.lastIndexOf("."));}return "";}/*** 生成文件名稱* @param fileName* @return*/private static String createFileName(String fileName) {//隨機生成六位驗證碼int code = (int) ((Math.random() * 9 + 1) * 100000);//通過md5加密文件String newFileName = MD5Util.getEncryptedPwd32(fileName + code);//文件后綴名String suffix = getSuffix(fileName);return newFileName + suffix;}/*** 創(chuàng)建文件目錄* @param fileName* @return*/private static String createFileDir(String fileName) {//獲取當前日期String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());//文件目錄AliyunOSSFileConfig fileConfig = getContentType(fileName);String fileDir = fileConfig.getFileDir();return fileDir + date + "/";} }4.使用方法
1)單文件上傳
String file ="/Applications/Developer/icloud/java/mybatis-plus/src/main/resources/static/2021.jpg";AliyunOSSUtils.getInstance().upload(new AliyunOSSFileConfig(file));2)多文件上傳(結(jié)果就不展示了)
List<AliyunOSSFileConfig> list = new ArrayList<>();list.add(new AliyunOSSFileConfig("/Applications/Developer/icloud/java/mybatis-plus/src/main/resources/static/2021.jpg"));list.add(new AliyunOSSFileConfig("/Applications/Developer/icloud/java/mybatis-plus/src/main/resources/static/cpop.jpeg")); AliyunOSSUtils.getInstance().uploadMultipleFile(list);3)下載文件(String fileName(文件名包含目錄), String dir(下載之后保存的目錄)))
AliyunOSSUtils.getInstance().download("image/2021-08-05/1dbb650b9f6d42ec2cbdc12a07da68e2.jpg","/Applications/Developer/icloud/java/mybatis-plus/src/main/resources/static/");4)獲取指定文件的臨時訪問路徑
AliyunOSSUtils.getInstance().getFileUrl("video/2021-08-05/d53bb0bd3aa4fb5ae4aabfd4514f2842.mp4");按照上面的步驟一步步配置,代碼直接復(fù)制開箱使用,切記一定要注意細節(jié)
總結(jié)
以上是生活随笔為你收集整理的阿里云OSS上传、下载、STS授权(Java篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 传奇病毒劫持流量手法分析
- 下一篇: java sts安装步骤_下载并安装Ja