SringBoot集成阿里云OSS上传文件

上一篇文章讲了如何将文件从linux同步到阿里云的oss有兴趣的小伙伴可以去看看,这篇文章讲述如何将文件上传到阿里云oss上,本文只详细写出后端java代码示例,前端和无用代码都会省略,可以上传文件,压缩文件,图片上传等

什么是阿里云对象存储oss?

阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%。

OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)、冷归档存储(Cold Archive)作为不经常访问数据的存储方式。

OSS相关概念

  • 存储类型(Storage Class)

    OSS提供标准、低频访问、归档、冷归档四种存储类型,全面覆盖从热到冷的各种数据存储场景。其中标准存储类型提供高持久、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据;冷归档存储适合需要超长时间存放的极冷数据。更多信息,请参见存储类型介绍

  • 存储空间(Bucket)

    存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。您可以根据实际需求,创建不同类型的存储空间来存储不同的数据。

  • 对象(Object)

    对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,例如最后修改时间、大小等信息,同时您也可以在元信息中存储一些自定义的信息。

  • 地域(Region)

    地域表示OSS的数据中心所在物理位置。您可以根据费用、请求来源等选择合适的地域创建Bucket。更多信息,请参见OSS已开通的地域

  • 访问域名(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

项目引入阿里云oss依赖

        <!-- 阿里云OSS -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>

OSS客户端初始化

使用spring注入的方式初始化配置

    @Value("${oss-endpoint}")
    private String ossEndpoint;
    @Value("${oss-access-key-id}")
    private String ossAccessKeyId";
    @Value("${oss-access-key-secret}")
    private String ossAccessKeySecret;
    @Value("${oss-oss-bucket-name}")
    private String ossBucketName;

    private Object lock = new Object();
    private volatile OSS ossClient;

    /**
     * 懒加载客户端,第一次调用初始化
     * <p>
     * 关闭OSSClient
     * ossClient.shutdown();
     */
    private OSS buildOssClient() {
    
    
        if (this.ossClient == null) {
    
    
            synchronized (lock) {
    
    
                if (this.ossClient == null) {
    
    
                    ossClient = new OSSClientBuilder().build(ossEndpoint, ossAccessKeyId, ossAccessKeySecret);
                }
            }
        }
        return ossClient;
    }

上传文件

可以上传txt、word、pdf、xml等文本文件,注意path路径 开头&结尾不用使用"/"

  /**
     * @param path     相对路径在bucket后 开头&结尾不用使用"/"  eg: a/b/c
     * @param fileName 文件名称 eg: a.txt
     * @param content  文本文件内容
     * @return boolean
     * @title: writeFile
     * @description: <p> oss写入文本文件,同路径+文件名称直接覆盖 </p>    
     */
    public boolean writeFile(String path, String fileName, String content) {
    
    
        PutObjectRequest putObjectRequest = new PutObjectRequest(this.ossBucketName,
                path + "/" + fileName, new ByteArrayInputStream(content.getBytes()));
        // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
        //ObjectMetadata metadata = new ObjectMetadata();
        //metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        //metadata.setObjectAcl(CannedAccessControlList.Private);
        //putObjectRequest.setMetadata(metadata);
        //上传字符串
        PutObjectResult putResult;
        try {
    
    
            putResult = this.buildOssClient().putObject(putObjectRequest);
        } catch (Exception e) {
    
    
            logger.error("oss上传文件异常!", e);
            return false;
        }
        if (logger.isDebugEnabled()) {
    
    
            logger.debug("oss上传文件结果:{}", JSONObject.toJSONString(putResult));
        }
        return true;
    }

上传压缩文件

/**
     * @param path     相对路径在bucket后 开头&结尾不用使用"/"  eg: a/b/c
     * @param fileName 文件名称 eg: a.txt.gz
     * @param content  文本文件内容
     * @return boolean
     * @title: gzipAndWriteFile
     * @description: <p> oss写入文本文件,使用gzip压缩, 同路径+文件名称直接覆盖</p>    
     */
    public boolean gzipAndWriteFile(String path, String fileName, String content) {
    
    
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (GzipCompressorOutputStream gzipOut = new GzipCompressorOutputStream(out)) {
    
    
            gzipOut.write(content.getBytes());
        } catch (Exception e) {
    
    
            logger.error("压缩字节异常!", e);
            return false;
        }
        PutObjectRequest putObjectRequest = new PutObjectRequest(this.ossBucketName,
                path + "/" + fileName, new ByteArrayInputStream(out.toByteArray()));
        //上传字符串
        PutObjectResult putResult;
        try {
    
    
            putResult = this.buildOssClient().putObject(putObjectRequest);
        } catch (Exception e) {
    
    
            logger.error("oss上传文件异常!", e);
            return false;
        }
        if (logger.isDebugEnabled()) {
    
    
            logger.debug("oss上传文件结果:{}", JSONObject.toJSONString(putResult));
        }
        return true;
    }

上传base64图片

上传图片一定要去除前缀以及base64文本中的空格,否则无法生成图片

/**
     * @description 上传base64图片
     * @param path 上传路径 a/b/
     * @param fileName 文件名 a.jpg
     * @param imgContent base64字符串   
     */
    public boolean writeBase64ToImg(String path, String fileName, String imgContent) {
    
    
        //上传字符串
        PutObjectResult putResult;
        // 创建一个Base64 对象
        BASE64Decoder decoder = new BASE64Decoder();
        // 将传进来的base64编码去除空格
        imgContent = imgContent.replaceAll(" ", "+");
        ObjectMetadata objectMeta = new ObjectMetadata();
        try {
    
    
            //去除前缀 data:image/jpg;base64,
            byte[] imageByte = decoder.decodeBuffer(imgContent.substring(imgContent.indexOf(",") + 1, imgContent.length()));
            //将字节码转换成流
            ByteArrayInputStream input = new ByteArrayInputStream(imageByte);
            objectMeta.setContentType("image/jpg");
            objectMeta.setContentLength(imageByte.length);
            putResult = buildOssClient().putObject(this.ossBucketName, path + fileName, input, objectMeta);
        } catch (Exception e) {
    
    
            logger.error("oss上传图片发生异常", e);
            return false;
        }
        if (logger.isDebugEnabled()) {
    
    
            logger.debug("oss上传文件结果:{}", JSONObject.toJSONString(putResult));
        }
        return true;
    }

关注我的微信公众号

​​
​​​​在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CharlesYooSky/article/details/120451420