SpringBoot集成阿里云OSS服务实现文件上传下载

41 篇文章 0 订阅
16 篇文章 0 订阅

提示这是我的个人IT资源网站,所有资源都免费,注册登录后就可以看到密码,需要什么大家尽情选取!

在项目中不管是上传文件还是图片,我们一般会选择上传到服务器,那么当我们想访问上传的文件或图片时,需要搭建WEB服务器对文件或图片进行映射,才能被外界访问,这时会产生两个问题,一是肯定会增加对服务器的访问请求,二是肯定会占用服务器的存储,其实除了存储在我们的服务器上这个方案外,还可以上传到可靠的第三方平台,我最近使用了阿里的OSS服务,感觉挺好使,所以在这里总结一下,并推荐给大家,有两个优点,一是提供各种语言的SDK,所以集成起来特别方便,二是阿里目前是国内的技术龙头,企业或者个人服务器很多都是使用阿里云服务器,所以在稳定性和安全性上毫无置疑,这样可以将一些文件图片的访问转移到阿里提供的OSS服务,一举两得,但是毕竟是用人家的服务,虽然有免费存储空间,但是有限,如果小体量的话,应该够用,大体量,我觉着也不差这点钱了,哈哈,下面我就一步一步介绍一下,如何将阿里的OSS服务集成到我们的SpringBoot项目中

  1. 首先肯定是登录阿里云了,现在都需要实名认证,可以通过支付宝登录,支付宝大家应该都有,而且信息互通,所以一登录就相当于实名认证了
    在这里插入图片描述

  2. 登录进去,我们找到OSS服务,点击进去
    在这里插入图片描述

  3. 然后点击右侧,创建一个Bucket,就像一个存储空间
    在这里插入图片描述

  4. 然后填写Bucket内容,主要填写名称和选择地域,还有一个读写权限,如果是一些公共都可以访问的图片或文件,就直接选择公共读
    在这里插入图片描述

  5. 创建之后,就可以在Bucket列表看到了
    在这里插入图片描述

  6. 下面我们就来集成到我们的SpringBoot项目里面,首先创建一个SpringBoot项目,这个过程就不列举了,大家应该都会,讲一下重点内容
    一、引入Maven依赖

<dependency>
	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-sdk-oss</artifactId>
	<version>3.1.0</version>
</dependency>

二、下面看一下主要的java代码,很少,很容易集成
//application.properties的配置信息,这些信息去阿里云网站查找
#阿里云OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=
在这里插入图片描述
#创建一个Access Key,找下图创建
aliyun.oss.file.keyid=
aliyun.oss.file.keysecret=
在这里插入图片描述
#创建Bucket时的名称
aliyun.oss.file.bucketname=

//常量类,读取application.properties内容
@Component
public class ConstantPropertiesUtils implements InitializingBean {

    //读取配置文件内容
    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;
    @Value("${aliyun.oss.file.keyid}")
    private String keyId;
    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;
    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;

    //定义公开静态常量
    public static String END_POINT;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }
}
//service实现类
@Service
public class OssServiceImpl implements OssService {

String endpoint = ConstantPropertiesUtils.END_POINT;
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

    //文件上传
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        
        try{

            //创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            //获取上传文件输入流
            InputStream inputStream = file.getInputStream();

            //获取文件名称
            String fileName = file.getOriginalFilename();

            //在文件名称里面添加随机唯一的值
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            fileName = uuid + fileName;

            //获取当前日期
            String datePath = new DateTime().toString("yyyy/MM/dd");

            fileName = datePath + "/" + fileName;

            ossClient.putObject(bucketName, fileName, inputStream);

            //关闭OSSClient
            ossClient.shutdown();

            //把上传之后文件路径返回
            String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            return url;




        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }
	/**
     * 文件下载
     * @param url
     */
     @Override
    public void downFileAvatar(String url, HttpServletResponse response){
        try {
            //创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
            String path = url.replace("https://" + bucketName + "." + endpoint + "/", "");
            OSSObject ossObject = ossClient.getObject(bucketName, path);

            // 读取文件内容。
            InputStream inputStream = ossObject.getObjectContent();

            response.reset();
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path.split("/")[path.split("/").length - 1], "UTF-8"));
            OutputStream outputStream = response.getOutputStream();
            // 循环取出流中的数据
            byte[] b = new byte[100];
            int len;
            try {
                while ((len = inputStream.read(b)) > 0) {
                    outputStream.write(b, 0, len);
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                inputStream.close();
                outputStream.close();
                // ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
                ossObject.close();
                ossClient.shutdown();
            }

        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (Throwable ce) {
            ce.printStackTrace();
        }
    }
}

这样基本就完成了集成阿里OSS服务,是不是很简单,大家可以试试!

下面是我集成后,上传图片成功后,返回的url,可以观察一下url

https://edu-lzy0707.oss-cn-beijing.aliyuncs.com/2021/05/26/06ff3d3ae9664fac909ec26857f65ddafile.png

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值