Spring Boot整合阿里云存储OSS

OSS

简介

OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据,非常方便。
使用前需要先注册开通阿里云存储服务。
官方网站:https://oss.console.aliyun.com/

阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%。
OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)作为不经常访问数据的存储方式。

相关概念

存储类型(Storage Class)
OSS提供标准、低频访问、归档三种存储类型,全面覆盖从热到冷的各种数据存储场景。其中标准存储类型提供高可靠、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据,在三种存储类型中单价最低。详情请参见官网存储类型介绍。
存储空间(Bucket)
存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。您可以根据实际需求,创建不同类型的存储空间来存储不同的数据。创建存储空间请参见官网创建存储空间。
对象(Object)
对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,例如最后修改时间、大小等信息,同时您也可以在元信息中存储一些自定义的信息。
地域(Region)
地域表示OSS的数据中心所在物理位置。您可以根据费用、请求来源等选择合适的地域创建Bucket。详情请参见 官网OSS 已开通的Region。
访问域名(Endpoint)
Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。具体的内容请参见官网各个Region对应的Endpoint。
访问密钥(AccessKey)
AccessKey简称AK,指的是访问身份验证中用到的AccessKey Id和AccessKey Secret。OSS通过使用AccessKey Id和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey Id用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。获取AccessKey的方法请参见官网创建AccessKey。

Spring Boot整合OSS

引入依赖

		 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--aliyunOSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

配置application.properties

# 按照注册的阿里云存储控制台中提供的信息进行如下配置
oss.file.endpoint=
oss.file.keyid=
oss.file.keysecret=
oss.file.bucketname=
oss.file.filehost=

开发配置类

AliossConfig.java

@Configuration
public class AliossConfig implements InitializingBean {
    @Value("${oss.file.endpoint}")
    private String java4all_file_endpoint;
    @Value("${oss.file.keyid}")
    private String java4all_file_keyid;
    @Value("${oss.file.keysecret}")
    private String java4all_file_keysecret;
    @Value("${oss.file.filehost}")
    private String java4all_file_filehost;
    @Value("${oss.file.bucketname}")
    private String java4all_file_bucketname1;

    public static String JAVA4ALL_END_POINT         ;
    public static String JAVA4ALL_ACCESS_KEY_ID     ;
    public static String JAVA4ALL_ACCESS_KEY_SECRET ;
    public static String JAVA4ALL_BUCKET_NAME1      ;
    public static String JAVA4ALL_FILE_HOST         ;

    @Override
    public void afterPropertiesSet() throws Exception {
        JAVA4ALL_END_POINT = java4all_file_endpoint;
        JAVA4ALL_ACCESS_KEY_ID = java4all_file_keyid;
        JAVA4ALL_ACCESS_KEY_SECRET = java4all_file_keysecret;
        JAVA4ALL_FILE_HOST = java4all_file_filehost;
        JAVA4ALL_BUCKET_NAME1 = java4all_file_bucketname1;
    }
}

开发工具类

AliyunOSSUtil.java
提供了简单的文件上传,文件删除和文件查询

public class AliyunOSSUtil {
    public static String endpoint= AliossConfig.JAVA4ALL_END_POINT;
    public static String accessKeyId=AliossConfig.JAVA4ALL_ACCESS_KEY_ID;
    public static String accessKeySecret=AliossConfig.JAVA4ALL_ACCESS_KEY_SECRET;
    public static String bucketName=AliossConfig.JAVA4ALL_BUCKET_NAME1;
    public static String fileHost=AliossConfig.JAVA4ALL_FILE_HOST;


    public static String upload(File file){
        System.out.println("=========>OSS文件上传开始:"+file.getName());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = format.format(new Date());
        if(null == file){
            return null;
        }
        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
        try {
            //容器不存在,就创建
            if(! ossClient.doesBucketExist(bucketName)){
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            //创建文件路径
            String fileUrl = fileHost+"/"+(dateStr + "/" + UUID.randomUUID().toString().replace("-","")+"-"+file.getName());
            //上传文件
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
            //设置权限 这里是公开读
            ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
            if(null != result){
                System.out.println("==========>OSS文件上传成功,OSS地址:"+fileUrl);
                return fileUrl;
            }
        }catch (OSSException oe){
            System.err.println(oe.getMessage());
        }catch (ClientException ce){
            System.err.println(ce.getMessage());
        }finally {
            //关闭
            ossClient.shutdown();
        }
        return null;
    }


    /**
     * 删除Object
     * @param fileKey
     * @return
     */
    public static String deleteFile(String fileKey){
        System.out.println("=========>OSS文件删除开始");
        try {
            OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
            if(!ossClient.doesBucketExist(bucketName)){
                System.out.println("==============>您的Bucket不存在");
                return "您的Bucket不存在";
            }else {
                System.out.println("==============>开始删除Object");
                ossClient.deleteObject(bucketName,fileKey);
                System.out.println("==============>Object删除成功:"+fileKey);
                return "==============>Object删除成功:"+fileKey;
            }
        }catch (Exception ex){
            System.err.println("删除Object失败" + ex);
            return "删除Object失败";
        }
    }

    /**
     * 查询文件名列表
     * @param bucketName
     * @return
     */
    public static List<String> getObjectList(String bucketName){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        List<String> listRe = new ArrayList<>();
        try {
            System.out.println("===========>查询文件名列表");
            OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
            ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
            //列出test目录下今天所有文件
            listObjectsRequest.setPrefix("test/"+format.format(new Date())+"/");
            ObjectListing list = ossClient.listObjects(listObjectsRequest);
            for(OSSObjectSummary objectSummary : list.getObjectSummaries()){
                listRe.add(objectSummary.getKey());
            }
            return listRe;
        }catch (Exception ex){
            System.out.println("==========>查询列表失败,失败原因:"+ ex);
            return new ArrayList<>();
        }
    }
}

开发测试验证接口

UploadController.java

@Controller
@RequestMapping("upload")
public class UploadController {
    @RequestMapping(value = "uploadFile",method = RequestMethod.POST)
    public String toUploadFile(MultipartFile file){
        System.out.println("============>文件上传");
        try {
            if(null != file){
                String filename = file.getOriginalFilename();
                if(!"".equals(filename.trim())){
                    File newFile = new File(filename);
                    FileOutputStream os = new FileOutputStream(newFile);
                    os.write(file.getBytes());
                    os.close();
                    file.transferTo(newFile);
                    //上传到OSS
                    String uploadUrl = AliyunOSSUtil.upload(newFile);
                }
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return "index";
    }

    @RequestMapping(value = "toUploadFile",method = RequestMethod.GET)
    public String toUploadFile(){
        return "upload";
    }
}

DeleteController.java

@RestController
@RequestMapping("/delete")
public class DeleteController {

    @RequestMapping(value = "deleteFile",method = RequestMethod.GET)
    @ResponseBody
    public String deleteFile(){
    //删除为了简单验证,写死固定值
        String ObjectKey = "test/2020-06-28/5247d2169fb240929f511c7613010101-2015-07-21-222033.png";
        AliyunOSSUtil.deleteFile(ObjectKey);
        return "删除成功";
    }
}

QueryController.java

@RestController
@RequestMapping("/query")
public class QueryController {

    @ResponseBody
    @RequestMapping(value = "getObjectList",method = RequestMethod.GET)
    public List<String> getObjectList(){
        String bucketName = AliossConfig.JAVA4ALL_BUCKET_NAME1;
        List<String> objectList = AliyunOSSUtil.getObjectList(bucketName);
        return objectList;
    }
}

由于文件上传需要有文件支持,所以简单开发一个上传页面,来满足上传功能:
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>文件上传</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="/upload/uploadFile">
    <p>文件:<input type="file" name="file"/></p>
    <p><input type="submit" value="上传" /></p>
</form>
</body>
</html>

运行验证:

启动程序,浏览器中输入localhost:8080,出现上传页面,点击上传,查看控制台信息:
Spring Boot整合阿里云存储OSS_第1张图片

2020-06-28 23:42:04.663  INFO 11816 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
============>文件上传
=========>OSS文件上传开始:2015-07-21-222033.png
==========>OSS文件上传成功,OSS地址:test/2020-06-28/5247d2169fb240929f511c7613010101-2015-07-21-222033.png

登录阿里云存储管理控制台查看验证:
Spring Boot整合阿里云存储OSS_第2张图片
再一次验证查询和删除:
查询:
Spring Boot整合阿里云存储OSS_第3张图片
删除:
控制台打印内容如下:

=========>OSS文件删除开始
==============>开始删除Object
==============>Object删除成功:test/2020-06-28/5247d2169fb240929f511c7613010101-2015-07-21-222033.png

登录云存储管理控制台查看,删除成功。
Spring Boot整合阿里云存储OSS_第4张图片

你可能感兴趣的:(学习,spring,boot)