【工具-代碼】OSS阿里雲存儲服務-代碼實現


上一章節【工具】OSS阿里雲存儲服務--超級簡單--個人還是覺得Fastdfs好玩

https://www.cnblogs.com/Yangbuyi/p/13488323.html

接上一個文章講解還有一個東西忘記說
AccessKey 這玩意用來搞認證的 差不多
開通就好了..等會要用到

步入正題創建oss模塊也就是一個項目

導入依賴

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!-- 上傳文件依賴組件 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- aliyun oss -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.7.RELEASE</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun Repository</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

創建OSSUploadUtil.java

package top.yangbuyi.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import top.yangbuyi.utils.config.OSSConfig;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @description: 楊不易網站:www.yangbuyi.top
 * @program: yangbuyispringcloudparent
 * @ClassName: OSSUtils
 * @create: 2020-08-11 23:09
 * @author: yangbuyi
 * @since: JDK1.8
 * @OSSUploadUtil: 阿里雲OSS文件上傳工具類
 **/

public class OSSUploadUtil {

	  private static OSSConfig config = null;

	  /**
	   *
	   * @MethodName: uploadFile
	   * @Description: OSS單文件上傳
	   * @param file
	   * @param fileType 文件后綴
	   * @return String 文件地址
	   */
	  public static String uploadFile(File file, String fileType){
			config = config==null?new OSSConfig():config;
			String fileName = config.getPicLocation()+ UUID.randomUUID().toString().toUpperCase().replace("-", "")+"."+fileType; //文件名,根據UUID來
			return putObject(file,fileType,fileName);
	  }

	  /**
	   *
	   * @MethodName: updateFile
	   * @Description: 更新文件:只更新內容,不更新文件名和文件地址。
	   *      (因為地址沒變,可能存在瀏覽器原數據緩存,不能及時加載新數據,例如圖片更新,請注意)
	   * @param file
	   * @param fileType
	   * @param oldUrl
	   * @return String
	   */
	  public static String updateFile(File file,String fileType,String oldUrl){
			String fileName = getFileName(oldUrl);
			if(fileName==null) return null;
			return putObject(file,fileType,fileName);
	  }

	  /**
	   *
	   * @MethodName: replaceFile
	   * @Description: 替換文件:刪除原文件並上傳新文件,文件名和地址同時替換
	   *      解決原數據緩存問題,只要更新了地址,就能重新加載數據)
	   * @param file
	   * @param fileType 文件后綴
	   * @param oldUrl 需要刪除的文件地址
	   * @return String 文件地址
	   */
	  public static String replaceFile(File file,String fileType,String oldUrl){
			boolean flag = deleteFile(oldUrl);      //先刪除原文件
			if(!flag){
				  //更改文件的過期時間,讓他到期自動刪除。
			}
			return uploadFile(file, fileType);
	  }

	  /**
	   *
	   * @MethodName: deleteFile
	   * @Description: 單文件刪除
	   * @param fileUrl 需要刪除的文件url
	   * @return boolean 是否刪除成功
	   */
	  public static boolean deleteFile(String fileUrl){
			config = config==null?new OSSConfig():config;

			String bucketName = OSSUploadUtil.getBucketName(fileUrl);       //根據url獲取bucketName
			String fileName = OSSUploadUtil.getFileName(fileUrl);           //根據url獲取fileName
			if(bucketName==null||fileName==null) return false;
			OSSClient ossClient = null;
			try {
				  ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
				  GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName);
				  ossClient.deleteObject(request);
			} catch (Exception oe) {
				  oe.printStackTrace();
				  return false;
			} finally {
				  ossClient.shutdown();
			}
			return true;
	  }

	  /**
	   *
	   * @MethodName: batchDeleteFiles
	   * @Description: 批量文件刪除(較快):適用於相同endPoint和BucketName
	   * @param fileUrls 需要刪除的文件url集合
	   * @return int 成功刪除的個數
	   */
	  public static int deleteFile(List<String> fileUrls){
			int deleteCount = 0;    //成功刪除的個數
			String bucketName = OSSUploadUtil.getBucketName(fileUrls.get(0));       //根據url獲取bucketName
			List<String> fileNames = OSSUploadUtil.getFileName(fileUrls);         //根據url獲取fileName
			if(bucketName==null||fileNames.size()<=0) return 0;
			OSSClient ossClient = null;
			try {
				  ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
				  DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(fileNames);
				  DeleteObjectsResult result = ossClient.deleteObjects(request);
				  deleteCount = result.getDeletedObjects().size();
			} catch (OSSException oe) {
				  oe.printStackTrace();
				  throw new RuntimeException("OSS服務異常:", oe);
			} catch (ClientException ce) {
				  ce.printStackTrace();
				  throw new RuntimeException("OSS客戶端異常:", ce);
			} finally {
				  ossClient.shutdown();
			}
			return deleteCount;

	  }

	  /**
	   *
	   * @MethodName: batchDeleteFiles
	   * @Description: 批量文件刪除(較慢):適用於不同endPoint和BucketName
	   * @param fileUrls 需要刪除的文件url集合
	   * @return int 成功刪除的個數
	   */
	  public static int deleteFiles(List<String> fileUrls){
			int count = 0;
			for (String url : fileUrls) {
				  if(deleteFile(url)){
						count++;
				  }
			}
			return count;
	  }

	  /**
	   *
	   * @MethodName: putObject
	   * @Description: 上傳文件
	   * @param file
	   * @param fileType
	   * @param fileName
	   * @return String
	   */
	  private static String putObject(File file,String fileType,String fileName){
			config = config==null?new OSSConfig():config;
			String url = null;      //默認null
			OSSClient ossClient = null;
			try {
				  ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
				  InputStream input = new FileInputStream(file);
				  ObjectMetadata meta = new ObjectMetadata();             // 創建上傳Object的Metadata
				  meta.setContentType(OSSUploadUtil.contentType(fileType));       // 設置上傳內容類型
				  meta.setCacheControl("no-cache");                   // 被下載時網頁的緩存行為
				  PutObjectRequest request = new PutObjectRequest(config.getBucketName(), fileName,input,meta);           //創建上傳請求
				  ossClient.putObject(request);
				  url = config.getEndpoint().replaceFirst("https://","https://"+config.getBucketName()+"."+ config.getEndpoint())+"/"+fileName;       //上傳成功再返回的文件路徑
			} catch (OSSException oe) {
				  oe.printStackTrace();
				  return null;
			} catch (ClientException ce) {
				  ce.printStackTrace();
				  return null;
			} catch (FileNotFoundException e) {
				  e.printStackTrace();
				  return null;
			} finally {
				  ossClient.shutdown();
			}
			return url;
	  }

	  /**
	   *
	   * @MethodName: contentType
	   * @Description: 獲取文件類型
	   * @param FileType
	   * @return String
	   */
	  private static String contentType(String fileType){
			fileType = fileType.toLowerCase();
			String contentType = "";
			switch (fileType) {
				  case "bmp": contentType = "image/bmp";
						break;
				  case "gif": contentType = "image/gif";
						break;
				  case "png":
				  case "jpeg":
				  case "jpg": contentType = "image/jpeg";
						break;
				  case "html":contentType = "text/html";
						break;
				  case "txt": contentType = "text/plain";
						break;
				  case "vsd": contentType = "application/vnd.visio";
						break;
				  case "ppt":
				  case "pptx":contentType = "application/vnd.ms-powerpoint";
						break;
				  case "doc":
				  case "docx":contentType = "application/msword";
						break;
				  case "xml":contentType = "text/xml";
						break;
				  case "mp4":contentType = "video/mp4";
						break;
				  default: contentType = "application/octet-stream";
						break;
			}
			return contentType;
	  }

	  /**
	   *
	   * @MethodName: getBucketName
	   * @Description: 根據url獲取bucketName
	   * @param fileUrl 文件url
	   * @return String bucketName
	   */
	  private static String getBucketName(String fileUrl){
			String http = "http://";
			String https = "https://";
			int httpIndex = fileUrl.indexOf(http);
			int httpsIndex = fileUrl.indexOf(https);
			int startIndex  = 0;
			if(httpIndex==-1){
				  if(httpsIndex==-1){
						return null;
				  }else{
						startIndex = httpsIndex+https.length();
				  }
			}else{
				  startIndex = httpIndex+http.length();
			}
			int endIndex = fileUrl.indexOf(".oss-");
			return fileUrl.substring(startIndex, endIndex);
	  }

	  /**
	   *
	   * @MethodName: getFileName
	   * @Description: 根據url獲取fileName
	   * @param fileUrl 文件url
	   * @return String fileName
	   */
	  private static String getFileName(String fileUrl){
			String str = "yangbuyi.top/";
			int beginIndex = fileUrl.indexOf(str);
			if(beginIndex==-1) return null;
			return fileUrl.substring(beginIndex+str.length());
	  }

	  /**
	   *
	   * @MethodName: getFileName
	   * @Description: 根據url獲取fileNames集合
	   * @param fileUrl 文件url
	   * @return List<String>  fileName集合
	   */
	  private static List<String> getFileName(List<String> fileUrls){
			List<String> names = new ArrayList<>();
			for (String url : fileUrls) {
				  names.add(getFileName(url));
			}
			return names;
	  }
}

創建Config.properties配置文件到resources下

#阿里雲OSS配置
endpoint = oss-img.yangbuyi.top # 訪問節點  這里表示 uri訪問的圖片域名相當於一個域名
bucketName = yangbuyi-img # 你創建的Bucket
picLocation = 文件夾路徑 隨便填  如: yangbuyi/
accessKeyId = 第一張圖片要你開通的 ID
accessKeySecret = 第一張圖片要你開通的 密碼

創建SystemConfig.java 處理配置文件

package top.yangbuyi.utils;


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @description: 楊不易網站:www.yangbuyi.top
 * @program: yangbuyispringcloudparent
 * @ClassName: SystemConfig
 * @create: 2020-08-12 00:04
 * @author: yangbuyi
 * @since: JDK1.8
 * @SystemConfig:
 **/
public class SystemConfig {

     private static final String CONFIG_PROPERTIES="config.properties";

     public static String getConfigResource(String key) throws IOException {
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
         Properties properties = new Properties();
         InputStream in = loader.getResourceAsStream(CONFIG_PROPERTIES);
         properties.load(in);
         String value = properties.getProperty(key);
         // 編碼轉換,從ISO-8859-1轉向指定編碼
         value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
         in.close();
         return value;
     }
}

創建config文件夾下的OSSConfig.java

package top.yangbuyi.utils.config;


import top.yangbuyi.utils.SystemConfig;

import java.io.IOException;

/**
 * @description: 楊不易網站:www.yangbuyi.top
 * @program: yangbuyispringcloudparent
 * @ClassName: OSSConfig
 * @create: 2020-08-12 00:04
 * @author: yangbuyi
 * @since: JDK1.8
 * @OSSConfig:
 **/

public class OSSConfig{
     private  String endpoint;       //連接區域地址
     private  String accessKeyId;    //連接keyId
     private  String accessKeySecret;    //連接秘鑰
     private  String bucketName;     //需要存儲的bucketName
     private  String picLocation;    //圖片保存路徑

     /*
     * 加載配置文件 初始化 參數
     * 也可 yml加載 看你自己  
     * */


     public OSSConfig() {
         try {
              this.endpoint = SystemConfig.getConfigResource("endpoint");
              this.bucketName = SystemConfig.getConfigResource("bucketName");
              this.picLocation = SystemConfig.getConfigResource("picLocation");
              this.accessKeyId = SystemConfig.getConfigResource("accessKeyId");
              this.accessKeySecret = SystemConfig.getConfigResource("accessKeySecret");

              System.out.println(toString());
              System.out.println(toString());
              System.out.println(toString());
              System.out.println(toString());
              System.out.println(toString());
              System.out.println(toString());
              System.out.println(toString());
              System.out.println(toString());

         } catch (IOException e) {
              e.printStackTrace();
         }
     }

     public String getEndpoint() {
         return endpoint;
     }
     public void setEndpoint(String endpoint) {
         this.endpoint = endpoint;
     }
     public String getAccessKeyId() {
         return accessKeyId;
     }
     public void setAccessKeyId(String accessKeyId) {
         this.accessKeyId = accessKeyId;
     }
     public String getAccessKeySecret() {
         return accessKeySecret;
     }
     public void setAccessKeySecret(String accessKeySecret) {
         this.accessKeySecret = accessKeySecret;
     }
     public String getBucketName() {
         return bucketName;
     }
     public void setBucketName(String bucketName) {
         this.bucketName = bucketName;
     }
     public String getPicLocation() {
         return picLocation;
     }
     public void setPicLocation(String picLocation) {
         this.picLocation = picLocation;
     }

     @Override
     public String toString() {
         return "OSSConfig{" +
               "endpoint='" + endpoint + '\'' +
               ", accessKeyId='" + accessKeyId + '\'' +
               ", accessKeySecret='" + accessKeySecret + '\'' +
               ", bucketName='" + bucketName + '\'' +
               ", picLocation='" + picLocation + '\'' +
               '}';
     }
}

在測試當中創建測試類

import org.junit.Test;
import top.yangbuyi.utils.OSSUploadUtil;
import top.yangbuyi.utils.OSSUtils;

import java.io.File;

/**
 * @description: 楊不易網站:www.yangbuyi.top
 * @program: yangbuyispringcloudparent
 * @ClassName: two
 * @create: 2020-08-12 00:06
 * @author: yangbuyi
 * @since: JDK1.8
 * @two: OSSUploadUtil.uploadFile(File file, String fileType) //單文件上傳,type:文件后綴名
 * OSSUploadUtil.updateFile(File file, String fileType, String oldUrl)//更新文件:只更新內容,不更新文件名和文件地址。
 * OSSUploadUtil.replaceFile(File file, String fileType, String oldUrl)//替換文件,刪除源文件並上傳新文件,文件名和地址也改變
 * OSSUploadUtil.deleteFile(List<String> fileUrls)  //刪除多文件,根據問價url來自定獲取其中的bucket和文件名,用於bucket和文件名可能存在不同的,循環調用deleteFile方法
 * OSSUploadUtil.deleteFile(String fileUrl) //刪除單文件
 * OSSUploadUtil.deleteFiles(List<String> fileUrls)  //刪除多文件,根據配置直接取刪除多個文件,bucket和文件地址從配置中獲取,用於多文件bucket和文件名都相同的
 **/

public class two {

     @Test
     public void t() {
         // 文件上傳
         File file = new File("F:\\美女圖片\\dac18dd66fbbf53ddd55563b5edecac6.jpg");
         String jpg = OSSUploadUtil.uploadFile(file, "jpg");
         System.out.println(jpg);


         // 更新 只更新 圖片  不更新名稱
         System.out.println("更新圖片開始:" + "http://oss-img.yangbuyi.top/github.png");
         File file2 = new File("F:\\美女圖片\\httpsimg2020.cnblogs.comblog17352552020081735255-20200805220326890-2058657956.jpg");
         String jpg1 = OSSUploadUtil.updateFile(file2, "jpg", "http://oss-img.yangbuyi.top/github.png");
         System.out.println("更新后的:" + jpg1);

         // 刪除  根據url 刪除圖片
//       boolean b = OSSUploadUtil.deleteFile("https://yangbuyi.oss-cn-beijing.aliyuncs.com/imgBAA8AD5484D847E09BDB535765A9EEB9.jpg");
//       System.out.println(b);

     }


}

看到這 是不是覺得 超級簡單 就CV大法。。

給到的項目地址 有不同oss實現 本文章只講了 OSSuploadUtil 對應的測試類為 two.java

測試完畢復制url訪問

http://oss-img.yangbuyi.top/github.png

項目地址: https://gitee.com/yangbuyi/ossAlibaba

項目地址: https://gitee.com/yangbuyi/ossAlibaba

項目地址: https://gitee.com/yangbuyi/ossAlibaba

項目地址: https://gitee.com/yangbuyi/ossAlibaba

本章節oss文件上傳結束,如有問題評論區見.


免責聲明!

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



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