阿里云OSS对象存储 Java实现OSS文件上传(代码示例)

一、首先进入阿里云官网,开通“对象存储OSS”服务

1.官网地址:阿里云官网

在这里插入图片描述

2.注册阿里云账号并登录,打开控制台

在这里插入图片描述

3.点击左上角,搜索“对象存储OSS”,开通“对象存储OSS”服务

在这里插入图片描述
点击进入,会提示您尚未开通,只需根据提示正常开通即可。
在这里插入图片描述

二、控制台使用

1.创建Bucket存储空间

命名:根据个人命名
读写权限:设置为公共读
在这里插入图片描述

2.创建成功后,我们可以简单的测试一下

在这里插入图片描述
创建文件夹avatar,上传测试图片
在这里插入图片描述
在这里插入图片描述
上传成功,文件列表里面就会有我们上传的文件
在这里插入图片描述

三、使用RAM子用户

1.进入子用户管理页面

点击右上角的主账号,选择AccessKey管理
在这里插入图片描述
选择使用子用户
在这里插入图片描述

2.添加用户

点击用户,创建用户
在这里插入图片描述在这里插入图片描述

3、获取子用户key

创建成功后,一定要马上保存你的 AccessKey ID 和 AccessKey Secret,下次进来就不会显示了。切记!!!!!这个很重要,没有保存到就只有重新创建啦。

4、设置用户权限

在这里插入图片描述
写到这个,我们的前期准备工作就差不多已经完成了。下面就是通过调用SDK实现文件的上传功能啦。

四、调用SDK实现OSS文件上传功能(代码示例)

1.首先看一下项目的目录结构

在这里插入图片描述

2.pom.xml文件需要导入的依赖包

<dependencies>
<dependencies>

    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>service-base</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!--lombok用来简化实体类:需要安装lombok插件-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <!--aliyunOSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
    </dependency>

    <!-- 日期工具栏依赖 -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
    </dependency>

    <!--让自定义的配置在application.yaml进行自动提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!--lombok用来简化实体类:需要安装lombok插件-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <!--aliyunOSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
    </dependency>

    <!-- 日期工具栏依赖 -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
    </dependency>

    <!--让自定义的配置在application.yaml进行自动提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

3. 配置application.yml文件

aliyun:
  oss:
    endpoint: 你的endponit
    keyId: 你的阿里云keyid
    keySecret: 你的阿里云keysecret
    bucketName: srb-file

4.创建启动类

package com.atguigu.srb.oss;

@SpringBootApplication
@ComponentScan({"com.atguigu.srb", "com.atguigu.common"})
public class ServiceOssApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceOssApplication.class, args);
    }

}

5. 实现文件上传

读取yml配置文件的配置类

package com.atguigu.srb.oss.util;

@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties implements InitializingBean {

    private String endpoint;
    private String keyId;
    private String keySecret;
    private String bucketName;

    public static String ENDPOINT;
    public static String KEY_ID;
    public static String KEY_SECRET;
    public static String BUCKET_NAME;

    //当私有成员被赋值后,此方法自动被调用,从而初始化常量
    @Override
    public void afterPropertiesSet() throws Exception {
        ENDPOINT = endpoint;
        KEY_ID = keyId;
        KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}

controller控制层

package com.atguigu.srb.oss.controller;

import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.R;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.oss.service.IFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author pgx
 * @version V1.0.0
 * @date 2023/7/24 11:44
 */
@Api(tags = "阿里云文件管理")
@CrossOrigin // 跨域
@RestController
@Slf4j
@RequestMapping("/api/file")
public class FileController {

    @Resource
    private IFileService fileService;

    /**
     * 文件上传
     *
     * @param file
     * @param module
     * @return
     */
    @ApiOperation("文件上传")
    @PostMapping("/upload")
    public R upload(@ApiParam(value = "文件", required = true) @RequestParam("file") MultipartFile file,
                    @ApiParam(value = "模块", required = true) @RequestParam("module") String module) {
        try {
            InputStream inputStream = file.getInputStream();
            String originalFilename = file.getOriginalFilename();
            String uploadUrl = fileService.upload(inputStream, module, originalFilename);
            //返回R对象
            return R.ok().message("文件上传成功").data("url", uploadUrl);
        } catch (IOException e) {
            log.error("文件上传错误:{}", ExceptionUtils.getStackTrace(e));
            throw new BusinessException(ResponseEnum.UPLOAD_ERROR, e);
        }
    }

    @ApiOperation(value = "删除oss文件")
    @DeleteMapping("/remove")
    public R remove(@ApiParam(value = "要删除的文件路径", required = true) @RequestParam("url") String url) {

        fileService.remove(url);
        return R.ok().message("文件删除成功");
    }


}

service服务层

package com.atguigu.srb.oss.service;


import java.io.InputStream;

/**
 * @author pgx
 * @version V1.0.0
 * @date 2023/7/24 14:45
 */
public interface IFileService {


    /**
     * 文件上传阿里云
     * @param inputStream
     * @param module
     * @param originalFilename
     * @return
     */
    String upload(InputStream inputStream, String module, String originalFilename);

    /**
     * 删除文件
     * @param url
     */
    void remove(String url);
}

service的实现类

package com.atguigu.srb.oss.service.impl;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.oss.service.IFileService;
import com.atguigu.srb.oss.util.OssProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author pgx
 * @version V1.0.0
 * @date 2023/7/24 15:03
 */
@Service
@Slf4j
public class FileServiceImpl implements IFileService {
    @Override
    public String upload(InputStream inputStream, String module, String filename) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(OssProperties.ENDPOINT, OssProperties.KEY_ID, OssProperties.KEY_SECRET);
        log.info("OSSClient实例创建成功");
        try {
            //判断oss实例是否存在:如果不存在则创建,如果存在则获取
            if (!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)) {
                //创建bucket
                ossClient.createBucket(OssProperties.BUCKET_NAME);
                log.info("bucket存储空间【{}】创建成功", OssProperties.BUCKET_NAME);
                //设置oss实例的访问权限:公共读
                ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);
                log.info("【{}】存储空间访问权限设置为公共读成功");
            }
            //构建日期路径:avatar/2019/02/26/文件名
            String folder = new DateTime().toString("yyyy/MM/dd");
            //文件名:uuid.扩展名
            filename = UUID.randomUUID().toString() + filename.substring(filename.lastIndexOf("."));
            //文件根路径
            String key = module + "/" + folder + "/" + filename;
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(OssProperties.BUCKET_NAME, key, inputStream);
            // 创建PutObject请求。
            ossClient.putObject(putObjectRequest);
            log.info("oss文件上传成功");
            //阿里云文件绝对路径
            String endpoint = OssProperties.ENDPOINT.substring(OssProperties.ENDPOINT.lastIndexOf("//") + 2);
            //返回文件的访问路径
            return "https://" + OssProperties.BUCKET_NAME + "." + endpoint + "/" + key;
        } catch (OSSException oe) {
            log.error("OSSException 文件上传失败:{}", oe);
            throw new BusinessException(ResponseEnum.UPLOAD_ERROR, oe);
        } catch (ClientException ce) {
            log.error("ClientException 文件上传失败:{}", ExceptionUtils.getStackTrace(ce));
            throw new BusinessException(ResponseEnum.UPLOAD_ERROR, ce);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
                log.info("关闭ossClient");
            }
        }
    }

    @Override
    public void remove(String url) {
        OSS ossClient = new OSSClientBuilder().build(OssProperties.ENDPOINT, OssProperties.KEY_ID, OssProperties.KEY_SECRET);
        log.info("OSSClient实例创建成功");
        try {
            String endpoint = OssProperties.ENDPOINT.substring(OssProperties.ENDPOINT.lastIndexOf("//") + 2);
            //文件名(服务器上的文件路径)
            String host = "https://" + OssProperties.BUCKET_NAME + "." + endpoint + "/";
            String objectName = url.substring(host.length());
            // 删除文件或目录。如果要删除目录,目录必须为空。
            ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);
            log.info("{}文件删除成功", objectName);
        } catch (OSSException oe) {
            log.error("OSSException 文件删除失败:{}", oe);
            throw new BusinessException(ResponseEnum.REMOVE_ERROR, oe);
        } catch (ClientException ce) {
            log.error("ClientException 文件删除失败:{}", ExceptionUtils.getStackTrace(ce));
            throw new BusinessException(ResponseEnum.REMOVE_ERROR, ce);
        } finally {
            if (ossClient != null) {
                // 关闭OSSClient。
                ossClient.shutdown();
                log.info("关闭ossClient");
            }
        }
    }
}

写到这里,我们OSS文件上传的功能基本上就已经实现了。

五、使用swagger测试接口是否能够调用成功

在这里插入图片描述
在这里插入图片描述
现在我们再到OSS管理控制台查看下,是否已经上传到阿里云
在这里插入图片描述
在这里插入图片描述
到此就差不多已经结束了,感谢你的观看!如有不理解的地方,可私信交流学习。

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值