小白使用阿里云的oss實(shí)現(xiàn)文件云存儲(chǔ)

超級(jí)簡(jiǎn)單的阿里云oss使用,把我代碼復(fù)制即可使用

一.需求

項(xiàng)目需要上傳頭像,不想存在本地,之前用過阿里云其他產(chǎn)品,這里就使用一下阿里云的oss了,不得不說阿里云的產(chǎn)品使用步驟真的很清晰.這里說一下我自己的使用步驟.

步驟:

1.沒有阿里云賬號(hào)的先去注冊(cè)和認(rèn)證

選擇對(duì)象存儲(chǔ)oss,進(jìn)行開通



開通不要錢,有一定免費(fèi)額度


2.創(chuàng)建bucket,類似于文件夾

權(quán)限可以設(shè)置為公共讀


3.可視化使用

大家可以自己去文件管理里上傳一個(gè)圖片試試就知道了,每個(gè)存儲(chǔ)文件會(huì)生成一個(gè)對(duì)應(yīng)的url,拿到之后我們可以從阿里云上下載下來這個(gè)圖片.

4.開發(fā)使用

阿里云很多小白指南非常適合我這樣的菜雞,這里有一個(gè)oss開發(fā)者使用指南,大家可以點(diǎn)擊oss學(xué)習(xí)路徑的java sdk看看,所謂sdk類似于一個(gè)說明書

5.參考一下阿里云 oss java sdk

其實(shí)也就是兩步
1.引pom

<!--阿里云oss-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.8.0</version>
        </dependency>
        <!--阿里云oss-->

2.復(fù)制黏貼大法

步步高點(diǎn)讀機(jī)哪里不會(huì)點(diǎn)哪里,每一個(gè)操作阿里云都提供了對(duì)應(yīng)的api

這里寫一下我使用阿里云oss的圖片上傳,大家可作demo參考

由于阿里云一些密鑰配置和地域結(jié)點(diǎn),bucket等是常量級(jí)的,所以我這里抽取出來放在了application.properties中,方便管理 ,數(shù)據(jù)我手動(dòng)加密了....大家換成自己的即可,
這些配置key=value key都是自己隨便寫的(也不是,起碼可以見名思意),只是為了我們配置的一個(gè)配置類可以利用spring的依賴注入填充value而已

#配置阿里云oss的固定值
#阿里云 OSS
#不同的服務(wù)器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=XXXXXXXXXX
aliyun.oss.file.keysecret=XXXXXXXXXXXX
#bucket可以在控制臺(tái)創(chuàng)建,也可以使用java代碼創(chuàng)建
aliyun.oss.file.bucketname=zyh-XXXXXXXXX
配置類

說明:

  • 1.首先加了@Component注解使咱們的這個(gè)文件可以隨著spring容器一起啟動(dòng)
  • 2.該util類實(shí)現(xiàn)了InitializingBean ,可以在配置文件加載后調(diào)用afterPropertiesSet方法進(jìn)行一些操作
  • 3.我們這里先設(shè)置了一些private對(duì)象進(jìn)行配置文件中值的依賴注入
  • 4.我們這里重新定義了一些大寫的常量
    • 首先public使外部類(別的類)可以調(diào)用
      -static使外部類可以直接通過類名.(點(diǎn))調(diào)用
  • 在afterPropertiesSet中對(duì)常量進(jìn)行賦值
package com.zyh.future.util;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//服務(wù)器啟動(dòng)的時(shí)候讀取配置文件的內(nèi)容
@Component
public class ConstantPropertiesUtils implements InitializingBean {

    //如果我們直接@value("a")是把a(bǔ)賦值給endpoint
    //所以我們需要使用spring提供的一個(gè)方法"${a}"來獲取a對(duì)應(yīng)的值
    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String keyid;

    @Value("${aliyun.oss.file.keysecret}")
    private String keysecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String bucketname;

    //這些值賦值好了但是我們沒用辦法直接使用的。

    //我們可以設(shè)置一些staic靜態(tài)變量,這樣就可以直接用類名.來調(diào)用了
    public static String ENDPOINT;
    public static String KEYID;
    public static String KEYSECRET;
    public static String BUCKETNAME;

    //服務(wù)器啟動(dòng)就會(huì)初始化ConstantYmlUtils并且調(diào)用afterPropertiesSet方法讀取配置文件的內(nèi)容
    @Override
    public void afterPropertiesSet() throws Exception {
        ENDPOINT=endpoint;
        KEYID=keyid;
        KEYSECRET=keysecret;
        BUCKETNAME=bucketname;
    }
}

Controller

說明:
我們阿里云oss倉庫的url是一個(gè)咱們的倉庫+固定的地域結(jié)點(diǎn)值+咱們的文件名字,所以這里為了使上傳的文件名字不重復(fù),使用了一個(gè)idworker,不知道的可以看一下Twitter的 Snowflake(雪花算法)

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.zyh.future.entity.Result;
import com.zyh.future.entity.StatusCode;
import com.zyh.future.util.ConstantPropertiesUtils;
import com.zyh.future.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;


/**
 * 功能描述: 上傳文件到阿里云oss
 * @Param: 
 * @Return: 
 * @Author: Zyh
 * @Date: 2020/2/2 23:19
 */
@RestController
@CrossOrigin
@RequestMapping(value = "/fileupload")
public class FileUploadConteoller {
    @Autowired
    private IdWorker idWorker;

    /**
     * 功能描述: 上傳用戶頭像
     * @Param: [file]
     * @Return: com.zyh.future.entity.Result 返回頭像上傳后在阿里云oss上的路徑
     * @Author: Zyh
     * @Date: 2020/2/3 0:19
     */
    @RequestMapping(value = "/file",method = RequestMethod.POST)
    public Result fileUpload(@RequestParam("file") MultipartFile file){
        /*上傳文件到阿里云oss*/
        // 地域結(jié)點(diǎn)Endpoint以北京為例,其它Region請(qǐng)按實(shí)際情況填寫。
        String endpoint = ConstantPropertiesUtils.ENDPOINT;
        // 云賬號(hào)AccessKey有所有API訪問權(quán)限,建議遵循阿里云安全最佳實(shí)踐,創(chuàng)建并使用RAM子賬號(hào)進(jìn)行API訪問或日常運(yùn)維,
        String accessKeyId = ConstantPropertiesUtils.KEYID;
        String accessKeySecret = ConstantPropertiesUtils.KEYSECRET;
        String bucketName= ConstantPropertiesUtils.BUCKETNAME;
        /*上傳文件到阿里云oss*/
        //1.使用@RequestParam("file") MultipartFile file可以接收到文件
        //使用MultiparatFile 接收文件需要指定一個(gè)參數(shù)名,這個(gè)值應(yīng)該是我們前端指定的input文件標(biāo)簽名
        //2.得到上傳文件的名稱獲取上傳輸入流
        String filename = file.getOriginalFilename();
        System.out.print("所要上傳的文件名稱為:"+filename);

        //創(chuàng)建一個(gè)唯一id作為文件名字,并覆蓋之前的文件名字,之前的文件名字這里只顯示到console中
        filename = idWorker.nextId()+filename.substring(filename.lastIndexOf("."));

        //以我手動(dòng)上傳的文件為例http://zyh-future.oss-cn-beijing.aliyuncs.com/IMG_6407.JPG
        //前面都是固定的域https://zyh-future.oss-cn-beijing.aliyuncs.com/
        /*自己拼出來在之后阿里云上的文件路徑*/
        String path="http://"+bucketName+"."+endpoint+"/"+filename;
        try{

            InputStream inputStream = file.getInputStream();
            /*上傳文件到阿里云oss*/
            // 創(chuàng)建OSSClient實(shí)例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 上傳文件流。//參數(shù)分別為倉庫名稱,文件名稱,文件流
            ossClient.putObject(bucketName, filename, inputStream);

            // 關(guān)閉OSSClient。
            ossClient.shutdown();
            /*上傳文件到阿里云oss*/

        }catch (Exception e)
        {
            e.printStackTrace();
        return new Result(true, StatusCode.ERROR,"上傳失敗");
        }
        //返回頭像在阿里云oss上的路徑
        return new Result(true, StatusCode.OK,"上傳成功", path);

    }

}

大家搭建完了可以用postman測(cè)試一下

展示一下,我的OK

ps:如果我們想方便管理或者后期擴(kuò)展,我們這里也可以引入一個(gè)工具

        <!--日期時(shí)間工具-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>

我們可以用這個(gè)工具的一個(gè)方法String dirpath=new DateTime().tostring("yyyy/MM/dd");將當(dāng)前的時(shí)間轉(zhuǎn)換為yyyy/MM/dd的格式,比如2020/02/03
這樣我們上傳的文件名字時(shí)候可以以這個(gè)dirpath作為我們的圖片所在的文件夾名稱,以分布式id生成器生成的id為名稱存儲(chǔ).

        filename = dicpath+"/"+idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
     
ossClient.putObject(bucketName, filename, inputStream);


下面看一下效果


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容