SpringBoot使用阿里OSS實現檔案雲端儲存

溪源的奇思妙想發表於2020-10-27

SpringBoot使用阿里OSS實現檔案雲端儲存

前言

我們在專案中經常會使用到圖片或者文件資源,一般來說如何這類檔案比較少的時候我們可以直接存在在伺服器中,但是如果一旦這些檔案到達一定數量的時候如果在放在應用伺服器必然會影響應用伺服器的效能,並且有時候這些圖片資源也要直接用在前端顯示當中,所以放在應用伺服器也是不妥的。一些比較大的網際網路公司可能會使用一些分散式檔案系統來達到儲存檔案的目的,但這種方式門檻過高。如何找到一個合適且價效比高的檔案儲存方式呢?那麼不得不說的就是物件儲存服務OSS.

FastDFS分散式檔案系統可參考我的部落格:FastDFS分散式檔案系統

正文

物件儲存服務

物件儲存服務OSS):是一種海量、安全、低成本、高可靠的雲端儲存服務,適合存放任意型別的檔案:

  • OSS可用於圖片、音視訊、日誌等海量檔案的儲存。
  • 各種終端裝置、Web網站程式、移動應用可以直接向OSS寫入或讀取資料。
  • OSS支援流式寫入和檔案寫入兩種方式。
    簡單地來說,我們通過OSS可以避免在伺服器中儲存大量的檔案、圖片等資源增加伺服器的IO的讀寫頻寬。

在這裡插入圖片描述

SpringBoot使用阿里OSS實現檔案雲端儲存

前期準備

第一步:在阿里雲商城購買物件儲存服務

在這裡插入圖片描述

第二步:在阿里雲控制檯配置AccessKey

在這裡插入圖片描述

程式碼部分

maven依賴

<!--oss物件關係儲存-->
<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>3.5.0</version>
</dependency>

<!--apache comment tools-->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>

<!--提供檔案上傳下載-->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>

application.properties:配置類

##basic setting
server.port = 8080
server.address =127.0.0.1

# 解除檔案大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

OssManagerUtil.java:阿里OSS工具類

/**
 * 阿里Oss物件儲存工具類
 */
public class OssManagerUtil {

    private static String endpoint = “oss中獲取的oss公網路徑";
    private static String accessKeyId = “自己在阿里雲申請的accessKeyId";
    private static String accessKeySecret = "自己在阿里雲申請的accessKeySecret";
    private static String bucket = "bucket名稱";


    private static OSS client;


    static {
        client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }


    /**
     * 上傳圖片
     *
     * @param fileName 圖片名稱,圖片名稱包括資料夾名稱和“/”
     * @param length   圖片大小
     * @param content  輸入流
     */
    public static String uploadImage(String fileName, long length, InputStream content) {
        uploadBucketImage(bucket, fileName, length, content);
        return "https://" + bucket + "." + endpoint + "/" + fileName;
    }


    /**
     * 上傳檔案
     *
     * @param bucket   儲存空間名
     * @param fileName 檔名(包括資料夾名稱和“/”)
     * @param length   流的長度
     * @param content  輸入流
     */
    public static void uploadBucketImage(String bucket, String fileName, long length, InputStream content) {
        // 建立上傳Object的Metadata
        ObjectMetadata meta = new ObjectMetadata();
        // 必須設定ContentLength
        meta.setContentLength(length);
        // 上傳Object.
        client.putObject(bucket, fileName, content, meta);
    }


    /**
     * 刪除檔案
     *
     * @param fileName 檔名稱,圖片名稱包括資料夾名稱和“/”
     */
    public static boolean delShopImage(String fileName) {
        //判斷檔案是否存在
        boolean exist = client.doesObjectExist(bucket, fileName);
        //檔案不存在刪除失敗
        if (!exist) {
            return false;
        }
        //執行刪除
        client.deleteObject(bucket, fileName);
        return true;
    }


    /**
     * 獲得上傳檔案後url連結
     *
     * @param fileName 檔名(包括資料夾名稱和“/”)
     * @return
     */
    public static String getUrl(String fileName) {
        // 設定URL過期時間為10年  3600l* 1000*24*365*10
        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
        // 生成URL
        URL url = client.generatePresignedUrl(bucket, fileName, expiration);
        if (url != null) {
            return url.toString();
        }
        return null;
    }

    /**
     * 建立儲存空間
     *
     * @param bucketName 新建儲存空間預設為標準儲存型別,私有許可權。
     * @return
     */
    public static void crateBucket(String bucketName) {
        // 新建儲存空間預設為標準儲存型別,私有許可權。
        client.createBucket(bucketName);
    }
}

驗證

測試介面:檔案上傳

/**
 * 檔案上傳到阿里oss
 */
@PostMapping("/uploadFiletoOss")
@ApiOperation(value = "檔案上傳到阿里oss")
public ResponseResult uploadFiletoOss(@RequestParam("file")MultipartFile file)throws IOException{
    String fileName = file.getOriginalFilename();
    String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
    fileName = UUID.randomUUID().toString().replace("-", "") + "." + suffix;
    String url = OssManagerUtil.uploadImage(fileName,file.getInputStream().available(),file.getInputStream());
    return ResponseResult.success(url);
}

訪問測試介面:

在這裡插入圖片描述

開啟介面返回的OSS線上檔案URL,得到線上檔案:

在這裡插入圖片描述

原始碼

專案原始碼可從的我的github中獲取:github原始碼地址

該原始碼解析可參考我的部落格:開箱即用的SpringBoot模板

在這裡插入圖片描述

相關文章