Aliyun Oss 上傳檔案

HOsystem發表於2021-02-28

Aliyun OSS

OSS 簡介

阿里雲物件儲存OSS(Object Storage Service)是阿里雲提供的海量、安全、低成本、高持久的雲端儲存服務。

OSS 基本概念

官方文件:點我傳送

  • 儲存空間(Bucket)
  • 物件(Object)
  • ObjectKey
  • Region(地域)
  • Endpoint(訪問域名)
  • AccessKey(訪問金鑰)

OSS 功能概述

官方文件:點我傳送

  • 建立儲存空間
  • 上傳檔案
    • 簡單上傳: 包括流式上傳和檔案上傳。最大不能超過5GB。
    • 表單上傳: 最大不能超過5GB。
    • 追加上傳: 最大不能超過5GB。
    • 斷點續傳上傳: 支援併發、斷點續傳、自定義分片大小。大檔案上傳推薦使用斷點續傳。最大不能超過48.8TB。
    • 分片上傳: 當檔案較大時,可以使用分片上傳,最大不能超過48.8TB。
  • 下載檔案

OSS 使用

使用步驟:
p203792.jpg

建立儲存空間Bucket

官方文件:點我傳送

40F06D90-71F6-4e46-AC2F-4B5E8C718676.png

建立子目錄

建立目錄,更好的區分圖片存放的位置。也可以直接放在建立的Bucket上。
2BADC1E0-B481-4880-912C-B007F4C462E4.png

Java編碼

  • controller 層
/**
 * 圖片上傳 Controller
 */
@RestController
@RequestMapping("/images")
public class ImagesController {

    @PostMapping("/upload")
    public void upload(@RequestParam("imageString") String imageString) throws UnsupportedEncodingException {
        String list = seafoodService.upload(imageString);
    }
    
}
  • Service層

interface Service

/**
 * 上傳圖片 service介面
 */
public interface ISeafoodService {

    /**
     * 圖片上傳
     * @author Hosystem
     * @create 2021-2-24
     * @desc 圖片上傳
     **/
    String upload(String imageString) throws UnsupportedEncodingException;
}

ServiceImpl

/**
 * 上傳圖片 service
 */
@Service
public class SeafoodServiceImpl implements ISeafoodService {

    /**
     *  阿里雲 OSS 配置抽取yml
     */
    @Autowired
    AliPayClientProperties aliPayClientProperties;
    
    /**
     * 圖片上傳
     * @author HYH
     * @create 2021-2-24
     * @desc 圖片上傳 將圖片轉換成base64編碼然後傳進來
     * 
     * 參考文件:https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11186623.2.10.e50c46a19Q1Q52
     **/
    @Override
    public String upload(String imageString) {
        // 建立OSSClient例項。
        OSS ossClient = new OSSClientBuilder().build(appProps.getAliOssClientProperties().getEndpoint(), appProps.getAliOssClientProperties().getAccessKeyId(), appProps.getAliOssClientProperties().getAccessKeySecret());

        // 建立一個Base64 物件
        Base64 base64 = new Base64();

        // 將傳進來的base64編碼 進行解碼
        byte[] imageByte = base64.decode(imageString.toString());

        // 建立位元組流 將base64解碼後進行位元組流轉換
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageByte);

        // 上傳路徑 bucket目錄名 + 圖片的名稱  使用UUID隨機生成
        // OSS管理控制檯將所有檔名以正斜線(/)結尾的檔案顯示為資料夾;
        // 如:abc/efg/123.jpg這個路徑的檔案,在OSS管理控制檯上看起來就是123.jgp存放在abc資料夾下的efg子資料夾中。
        // 若想上傳到bucket 則 String url = UUID.randomUUID().toString() + "." + "jpg";
        String url = appProps.getAliOssClientProperties().getDirectoryPath() + UUID.randomUUID().toString() + "." + "jpg";

        // 檔案元資訊(Object Meta):包括HTTP header和自定義元資訊
        // 建立上傳檔案的元資訊,可以通過檔案元資訊設定HTTP header。
        // 參考文件:https://help.aliyun.com/document_detail/84840.html
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType("image/jpg");

        // 上傳檔案
        // 格式:ossClient.putObject("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes()), meta);
        ossClient.putObject(appProps.getAliOssClientProperties().getBucketName(), url, byteArrayInputStream, objectMetadata);

        // 關閉OSSClient
        ossClient.shutdown();

        // 返回上傳圖片的OSS路徑
        return appProps.getAliOssClientProperties().getUrl() + url;
    }
    
}
  • yml配置抽取
@Data
@Component
@Accessors(chain = true)
@ConfigurationProperties(prefix = "aliOssClientProperties")
public class AliOssClientProperties {

    /**
     *  阿里雲OSS endpoint
     */
    private String endpoint;

    /**
     *  阿里雲OSS AccessKey
     */
    private String accessKeyId;

    /**
     *  阿里雲OSS AccessKeySecret
     */
    private String accessKeySecret;

    /**
     *  阿里雲OSS bucketName
     */
    private String bucketName;

    /**
     *  阿里雲OSS url
     */
    private String url;

    /**
     *  阿里雲OSS directoryPath 目錄路徑
     */
    private String directoryPath;
}
  • yml配置
  # http://<bucket>.<endpoint>/<yourfile>+<yourdirectoryPath>
aliOssClientProperties:
  endpoint: oss-cn-shenzhen.aliyuncs.com
  accessKeyId: #accessKey
  accessKeySecret: #accessKeySecret
  bucketName: #bucketName
  url: https://<bucketName>.<endpoint>
  directoryPath: images/

測試

這裡我通過swagger進行測試,也可以通過postman進行測試,直接定義常量imageString 當作引數使用。
E0227E46-3158-483e-ABAE-11572DDCEB6E.png

參考文件1:點我傳送

參考文件2:點我傳送

參考文件3:點我傳送

相關文章