使用阿里雲的OSS保存圖片

  簡單說一下這個OSS幹啥用的,咱們知道mysql這種關係型數據庫最好不要存長文本還有二進制數據,好比圖片,文件等,那麼這些文件和圖片放哪裏呢?前端

  本篇說的就是放到阿里雲的OSS中去,而後數據庫中只存放對應的url,咱們只須要拿着這個url就能夠訪問到咱們須要的資源;例如用戶頭像,還有須要商品的圖片等等;java

 

1.首先到阿里雲中進入到OSS中,而後去建立一個Bucket,下面這樣:mysql

    

   

  只用修改下面三個,其餘的都是默認就行,注意這個bucket的名字很重要,後面在java代碼中須要配置:web

 

2.而後進入到建立的bucket中,找到這個endpoint複製下來,後面會用到;spring

 

 

3.找到你阿里雲本身的id和密鑰複製下來,後面會用到:sql

 

 

 4.新建一個springboot項目,而且經常使用的依賴(包括使用lombok和swagger)和OSS依賴,而且在properties配置文件中配置前面前3步複製下來的東西:docker

<!-- 阿里雲oss依賴 -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
        </dependency>
        <!-- 日期工具欄依賴 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>

 

aliyun.oss.file.bucketname=你的bucket的名字
aliyun.oss.file.endpoint=你的endpoint路徑
aliyun.oss.file.keyid=你的阿里雲的id
aliyun.oss.file.keysecret=你的阿里雲的密鑰

 

 5.使用一個類和上面properties文件中的屬性綁定起來,方便咱們使用:數據庫

package com.protagonist.utils;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "aliyun.oss.file")
public class ConstantPropertiesUtils{

    private String endpoint;

    private String keyid;

    private String keysecret;

    private String bucketname;

}

 

 6.controller代碼,返回保存在OSS中文件的全路徑,這個Result 就是一個對前端統一的類型,也能夠直接返回HashMapspringboot

package com.protagonist.controller;


import com.protagonist.responseVO.Result;
import com.protagonist.responseVO.StatusCode;
import com.protagonist.service.OssService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.HashMap;

@Api("文件上傳")
@RestController
@RequestMapping("/eduoss")
@CrossOrigin
public class OssController {
    @Resource
    private OssService ossService;

    //上傳頭像的方法
    @PostMapping("/fileOss")
    @ApiOperation(value = "文件上傳")
    public Result UploadOssFile(MultipartFile file) {
        String url = ossService.uploadFileAvatar(file);
        HashMap<String, String> map = new HashMap<>();
        map.put("url",url);
        return new Result<>(true, StatusCode.OK,"上傳成功",map);
    }
}

 

 7.service代碼,只須要修改那個自定義異常還有狀態碼,其餘的不須要改:服務器

package com.protagonist.service;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.protagonist.responseVO.StatusCode;
import com.protagonist.servicebase.exception.ProtagonistException;
import com.protagonist.utils.ConstantPropertiesUtils;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.UUID;

@Service
@Slf4j
public class OssService{

    @Resource
    private ConstantPropertiesUtils constantPropertiesUtils;

    public String uploadFileAvatar(MultipartFile file) {
        //獲取oss上傳配置文件中的參數
        String bucketName = constantPropertiesUtils.getBucketname();
        String endpoint = constantPropertiesUtils.getEndpoint();
        String keyId = constantPropertiesUtils.getKeyid();
        String keySecret = constantPropertiesUtils.getKeysecret();

        OSS ossClient;
        InputStream inputStream;
        try {
            // 建立OSSClient實例。
            ossClient  = new OSSClientBuilder().build(endpoint, keyId, keySecret);
            // 上傳文件流
            inputStream = file.getInputStream();

            //爲了使得文件能夠重複上傳,每次上傳的時候須要將文件名進行修改
            String fileName = file.getOriginalFilename();
            log.info("圖片上傳的名字爲:{}",fileName);
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String newFileName = uuid + fileName;

            //獲取當前日期,而後以日期和新的文件名組成全路徑,使得oss中的文件按照日期進行分類存儲
            String date = new DateTime().toString("yyyy/MM/dd");
            String fullFileName = date + "/" + newFileName;
            log.info("圖片保存在oss的全路徑爲:{}",fullFileName);

            //第一個參數Bucket名稱 第二個參數 上傳到oss文件路徑和文件名稱
            ossClient.putObject(bucketName, fullFileName, inputStream);

            // 關閉OSSClient。
            ossClient.shutdown();
            return "https://"+bucketName+"."+ endpoint+"/"+fullFileName;
        } catch (Exception e) {
            log.error("文件上傳失敗",e);
            throw new ProtagonistException(StatusCode.REMOTEERROR,"文件上傳oss失敗");
        }
    }
}

 

 8.測試,圖片上傳成功,返回OSS中保存的url,而後前端就能夠直接拿到這個url作些花裏胡哨的事!

 

 

 

  咱們能夠看看OSS中保存的圖片;

 

  其實這種圖片還有文件啥的,也能夠本身本身搭建一個文件服務器丟到裏面去,簡單一點的使用docker,有興趣的能夠試試!

相關文章
相關標籤/搜索