SpringBoot使用阿里OSS实现文件云存储

SpringBoot使用阿里OSS实现文件云存储

前言

我们在项目中经常会使用到图片或者文档资源,一般来说如何这类文件比较少的时候我们可以直接存在在服务器中,但是如果一旦这些文件到达一定数量的时候如果在放在应用服务器必然会影响应用服务器的性能,并且有时候这些图片资源也要直接用在前端显示当中,所以放在应用服务器也是不妥的。一些比较大的互联网公司可能会使用一些分布式文件系统来达到存储文件的目的,但这种方式门槛过高。如何找到一个合适且性价比高的文件存储方式呢?那么不得不说的就是对象存储服务OSS.

FastDFS分布式文件系统可参考我的博客:FastDFS分布式文件系统

正文

对象存储服务

对象存储服务OSS):是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件:

  • OSS可用于图片、音视频、日志等海量文件的存储。
  • 各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。
  • OSS支持流式写入和文件写入两种方式。
    简单地来说,我们通过OSS可以避免在服务器中存储大量的文件、图片等资源增加服务器的IO的读写带宽。

在这里插入图片描述

SpringBoot使用阿里OSS实现文件云存储

前期准备

第一步:在阿里云商城购买对象存储服务

在这里插入图片描述

第二步:在阿里云控制台配置AccessKey

在这里插入图片描述

代码部分

maven依赖

<!--oss对象关系存储-->
<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>3.5.0</version>
</dependency>

<!--apache comment tools-->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>

<!--提供文件上传下载-->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>

application.properties:配置类

##basic setting
server.port = 8080
server.address =127.0.0.1

# 解除文件大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

OssManagerUtil.java:阿里OSS工具类

/**
 * 阿里Oss对象存储工具类
 */
public class OssManagerUtil {

    private static String endpoint = “oss中获取的oss公网路径";
    private static String accessKeyId = “自己在阿里云申请的accessKeyId";
    private static String accessKeySecret = "自己在阿里云申请的accessKeySecret";
    private static String bucket = "bucket名称";


    private static OSS client;


    static {
        client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }


    /**
     * 上传图片
     *
     * @param fileName 图片名称,图片名称包括文件夹名称和“/”
     * @param length   图片大小
     * @param content  输入流
     */
    public static String uploadImage(String fileName, long length, InputStream content) {
        uploadBucketImage(bucket, fileName, length, content);
        return "https://" + bucket + "." + endpoint + "/" + fileName;
    }


    /**
     * 上传文件
     *
     * @param bucket   存储空间名
     * @param fileName 文件名(包括文件夹名称和“/”)
     * @param length   流的长度
     * @param content  输入流
     */
    public static void uploadBucketImage(String bucket, String fileName, long length, InputStream content) {
        // 创建上传Object的Metadata
        ObjectMetadata meta = new ObjectMetadata();
        // 必须设置ContentLength
        meta.setContentLength(length);
        // 上传Object.
        client.putObject(bucket, fileName, content, meta);
    }


    /**
     * 删除文件
     *
     * @param fileName 文件名称,图片名称包括文件夹名称和“/”
     */
    public static boolean delShopImage(String fileName) {
        //判断文件是否存在
        boolean exist = client.doesObjectExist(bucket, fileName);
        //文件不存在删除失败
        if (!exist) {
            return false;
        }
        //执行删除
        client.deleteObject(bucket, fileName);
        return true;
    }


    /**
     * 获得上传文件后url链接
     *
     * @param fileName 文件名(包括文件夹名称和“/”)
     * @return
     */
    public static String getUrl(String fileName) {
        // 设置URL过期时间为10年  3600l* 1000*24*365*10
        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
        // 生成URL
        URL url = client.generatePresignedUrl(bucket, fileName, expiration);
        if (url != null) {
            return url.toString();
        }
        return null;
    }

    /**
     * 创建存储空间
     *
     * @param bucketName 新建存储空间默认为标准存储类型,私有权限。
     * @return
     */
    public static void crateBucket(String bucketName) {
        // 新建存储空间默认为标准存储类型,私有权限。
        client.createBucket(bucketName);
    }
}

验证

测试接口:文件上传

/**
 * 文件上传到阿里oss
 */
@PostMapping("/uploadFiletoOss")
@ApiOperation(value = "文件上传到阿里oss")
public ResponseResult uploadFiletoOss(@RequestParam("file")MultipartFile file)throws IOException{
    String fileName = file.getOriginalFilename();
    String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
    fileName = UUID.randomUUID().toString().replace("-", "") + "." + suffix;
    String url = OssManagerUtil.uploadImage(fileName,file.getInputStream().available(),file.getInputStream());
    return ResponseResult.success(url);
}

访问测试接口:

在这里插入图片描述

打开接口返回的OSS在线文件URL,得到在线文件:

在这里插入图片描述

源码

项目源码可从的我的github中获取:github源码地址

该源码解析可参考我的博客:开箱即用的SpringBoot模板

在这里插入图片描述

溪源的奇思妙想 CSDN认证博客专家 Java Redis 架构
微信公众号:溪源的奇思妙想
溪源,一个在IT技术圈和经济学之间的求知者——既对人工智能、物联网等前沿技术兴致勃勃,又对机会成本、边际收益等经济学理论流连忘返。人生是一场孤独的旅行,只是我还是侥幸期待有同路人,我希望认识同样热爱技术、迷恋经济学的你。
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页