SpringBoot整合阿里云OSS

阿里云OSS

為了解決海量數(shù)據(jù)存儲與彈性擴(kuò)容,我們一般采用云存儲的解決方案-阿里云OSS梧乘。

一绊序、測試Bucket

Bucket可以理解為電腦上的磁盤

引入相關(guān)依賴

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.1.0</version>
</dependency>

測試創(chuàng)建Bucket的連接茴迁。其中:

  1. endpoint :創(chuàng)建Bucket后概覽頁面獲取
  2. accessKeyId :可由右上角個人信息中AccessKey管理獲取
  3. accessKeySecret :可由右上角個人信息中AccessKey管理獲取
  4. bucketName :創(chuàng)建Bucket時的名稱
public class TestOSS {

    // yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint孔飒。以華東1(杭州)為例灌闺,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
    String endpoint = "your-endpoint";
    // 阿里云賬號AccessKey擁有所有API的訪問權(quán)限坏瞄,風(fēng)險很高桂对。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶進(jìn)行API訪問或日常運(yùn)維,請登錄RAM控制臺創(chuàng)建RAM用戶鸠匀。
    String accessKeyId = "your-accessKeyId ";
    String accessKeySecret = "your-accessKeySecret ";
    // 填寫B(tài)ucket名稱蕉斜,例如examplebucket。
    String bucketName = "your-bucketName  ";

    @Test
    public void testCreateBucket() {
        // 創(chuàng)建OSSClient實(shí)例
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 創(chuàng)建存儲空間
        ossClient.createBucket(bucketName);
        // 關(guān)閉ossClient
        ossClient.shutdown();
    }

}

判斷存儲空間是否存在

@Test
public void testExist() {
    // 創(chuàng)建OSSClient實(shí)例
    OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

    boolean exist = ossClient.doesBucketExist(bucketName);
    System.out.println(exist);

    // 關(guān)閉ossClient
    ossClient.shutdown();

}

二、文件上傳

配置application.properties

#服務(wù)端口
server.port=8080

# 應(yīng)用名稱
spring.application.name=OssDemo01

#阿里云 OSS
#不同的服務(wù)器宅此,地址不同
aliyun.oss.file.endpoint=your Endpoint
aliyun.oss.file.keyid=your AccessKeyID
aliyun.oss.file.keysecret=your AccessKeySecret
#bucket可以在控制臺創(chuàng)建机错,也可以使用java代碼創(chuàng)建
aliyun.oss.file.bucketname=your BucketName

從配置文件讀取常量
創(chuàng)建常量讀取工具類:ConstantPropertiesUtil.java
使用@Value讀取 application.properties 里的配置內(nèi)容
用 Spring 的 InitializingBean 的 afterPropertiesSet 來初始化配置信息,這個方法將在所有的屬性被初始化后調(diào)用父腕。

/**
 * 常量類毡熏,讀取配置文件application.properties中的配置
 */
@Component
//@PropertySource("classpath:application.properties")
public class ConstantPropertiesUtil implements InitializingBean {

    @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.filehost}")
    private String fileHost;

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

    public static String END_POINT;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;
    public static String FILE_HOST ;

    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
        FILE_HOST = fileHost;
    }
}

創(chuàng)建service接口

public interface IFileService {

    /**
     * 文件上傳至阿里云
     * @param file
     * @return
     */
    String upload(MultipartFile file);
}

實(shí)現(xiàn)接口

@Service
public class FileService Impl implements IFileService {

    @Override
    public String upload(MultipartFile file) {
        //工具類獲取值
        String endpoint = ConstantPropertiesUtil.END_POIND;
        String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;

        try {
            // 創(chuàng)建OSSClient實(shí)例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 上傳文件流
            InputStream inputStream = file.getInputStream();

            //獲取文件名稱
            String fileName = file.getOriginalFilename();

            //存在問題:多次上傳相同文件的名稱侣诵,造成最后一次上傳把之前上傳文件覆蓋
            //解決:方式1.在文件名稱里面添加隨機(jī)唯一的值
            String uuid = UUID.randomUUID().toString().replace("-", "");
            fileName = uuid + fileName;
            //方式2  把文件按照日期進(jìn)行分類
            String datePath = new DateTime().toString("yyyy/MM/dd");
            fileName = datePath +"/" + fileName;

            //調(diào)用oss方法實(shí)現(xiàn)上傳
            //第一個參數(shù):Bucket名稱
            //第二個參數(shù):上傳到oss文件路徑和文件名稱
            //第三個參數(shù):上傳文件輸入流
            ossClient.putObject(bucketName,fileName,inputStream);

            // 關(guān)閉OSSClient。
            ossClient.shutdown();

            //把上傳之后的文件路徑返回
            String url = "https://" + bucketName + "."+endpoint + "/" + fileName;
            return url;
        }catch (Exception e){

            e.printStackTrace();
            return null;

        }
    }
}

控制層

@RestController
@RequestMapping("/file/upload")
@AllArgsConstructor
public class FileController {

    private final IFileService fileService;

    @PostMapping
    public String upload(MultipartFile file){
        //獲取上傳文件 MultipartFile
        //返回上傳到oss的路徑
        String url = fileService.upload(file);
        return url;
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狱窘,一起剝皮案震驚了整個濱河市杜顺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蘸炸,老刑警劉巖躬络,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搭儒,居然都是意外死亡穷当,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門淹禾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馁菜,“玉大人,你說我怎么就攤上這事铃岔⊥舸” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵毁习,是天一觀的道長智嚷。 經(jīng)常有香客問我,道長纺且,這世上最難降的妖魔是什么盏道? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮载碌,結(jié)果婚禮上猜嘱,老公的妹妹穿的比我還像新娘。我一直安慰自己恐仑,他們只是感情好泉坐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裳仆,像睡著了一般腕让。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天纯丸,我揣著相機(jī)與錄音偏形,去河邊找鬼。 笑死觉鼻,一個胖子當(dāng)著我的面吹牛俊扭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坠陈,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萨惑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仇矾?” 一聲冷哼從身側(cè)響起庸蔼,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贮匕,沒想到半個月后姐仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻盐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年掏膏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敦锌。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡馒疹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出供屉,到底是詐尸還是另有隱情行冰,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布伶丐,位于F島的核電站悼做,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哗魂。R本人自食惡果不足惜肛走,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望录别。 院中可真熱鬧朽色,春花似錦、人聲如沸组题。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崔列。三九已至梢褐,卻和暖如春旺遮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盈咳。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工耿眉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鱼响。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓鸣剪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丈积。 傳聞我的和親對象是個殘疾皇子筐骇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容