阿里OSS对象---头像上传

Posted 小吴吃肉啦~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里OSS对象---头像上传相关的知识,希望对你有一定的参考价值。

阿里OSS对象

使用场景: 将用户的头像传到阿里OSS对象中保存

步骤

对象存储OSS

1开通对象存储OSS服务

1申请阿里云账号

2实名认证

3开通“对象存储OSS”服务

4进入管理控制台

2、创建Bucket

选择:标准存储、公共读、不开通

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oq5BiQJS-1654333278564)(D:\\XAJ210905\\笔记图\\image-20220604162857882.png)]

二、使用SDK

1、创建Mavaen项目

com.atguigu

aliyun-oss

2、pom导入依赖

<dependencies> 
 <!--aliyunOSS-->
	<dependency> 
 	<groupId>com.aliyun.oss</groupId> 
 	<artifactId>aliyun-sdk-oss</artifactId> 
 	<version>2.8.3</version> 
 </dependency> 
 <dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	</dependency>
</dependencies>

在application.properties中配置 oss中对象信息

#服务端口
server.port=8002
#服务名
spring.application.name=service-oss

#环境设置:dev、test、prod
spring.profiles.active=dev

#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=  根据oss 来写
aliyun.oss.file.keyid=根据oss 来写
aliyun.oss.file.keysecret=根据oss 来写
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=根据oss 来写

如上操作要是木有理解 可以看它的视频进行学习https://www.bilibili.com/video/BV1dQ4y1A75e?p=85&t=2.5

实现文件上传

从配置文件中读取常量

创建常量读取工具类:ConstantPropertiesUtil.java

使用@Value读取application.properties里的配置内容

用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化

后调用。

package com.atguigu.oss.utils;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//当项目已启动,spring接口,spring加载之后,执行接口一个方法
@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_POIND;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception 
        END_POIND = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    


在controller中 书写

上传文件 使用 MultipartFile

package com.atguigu.oss.controller;

import com.atguigu.commonutils.R;
import com.atguigu.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/eduoss/fileoss")
public class OssController 

    @Autowired
    private OssService ossService;
    //上传头像的方法
    @PostMapping
    public R uploadOssFile(MultipartFile file)
        //获取上传文件  MultipartFile
        String url = ossService.uploadFileAvatar(file);

        return R.ok().data("url",url);
    



在 service 层中 写 逻辑 直接在阿里云的官网中获取

https://help.aliyun.com/document_detail/84781.html

选着 上传文件流 直接复制 优化三的代码

下面代码没有进行优化 !!!

package com.atguigu.oss.service.impl;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import java.io.FileInputStream;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.utils.ConstantPropertiesUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.aliyun.oss.ClientException;

import java.io.IOException;
import java.io.InputStream;


import java.io.InputStream;

@Service
public class OssServiceImpl implements OssService 

    // 上传头像到oss中
    @Override
    public String uploadFileAvatar(MultipartFile file) 

        //通过工具类获取
        String endpoint = ConstantPropertiesUtils.END_POIND;
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

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

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

            //获取文件名称
            String filename = file.getOriginalFilename();
            // 创建PutObject请求。
            //第一个参数 :  Bucket名称
            //第二个参数 : 上传到oss文件路径和文件名称
            //第三个参数 : 上传文件的输入流
            ossClient.putObject(bucketName, filename, inputStream);

            //关闭OSSClient
            ossClient.shutdown();
            
            //把上传之后文件路劲返回
            //需要手动拼接阿里云Oss 路径
            String url = "https//"+bucketName+"."+endpoint+"/"+filename;

            return url;

         catch (IOException e) 
            e.printStackTrace();
            return null;
        


    


完成后 进行测试

http://localhost:8002/swagger-ui.html

代码优化

优化一 :

缺陷 : 多次上传相同的名称文件 , 造成 最后一次上传的文件会覆盖之前的文件

解决方式: 在文件名添加随机唯一的值,让每个文件名称不同

​ 使用uuid

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

优化二:

把文件进行分类

根据日期进行分类

首先导入 时间工具 依赖

  <!-- 日期工具栏依赖 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>
 // 2 把文件按照日期进行分类
                //获取当前日期
            String datePath = new DateTime().toString("yyyy/MM/dd");
            filename = datePath+"/"+filename;

优化三 : 将优化一方法 和 优化二方法 进行 合并

package com.atguigu.oss.service.impl;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import java.io.FileInputStream;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.aliyun.oss.ClientException;

import java.io.IOException;
import java.io.InputStream;


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

@Service
public class OssServiceImpl implements OssService 

    // 上传头像到oss中
    @Override
    public String uploadFileAvatar(MultipartFile file) 

        //通过工具类获取
        String endpoint = ConstantPropertiesUtils.END_POIND;
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

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

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

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

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

            // 2 把文件按照日期进行分类
                //获取当前日期
            String datePath = new DateTime().toString("yyyy/MM/dd");
            filename = datePath+"/"+filename;

            // 创建PutObject请求。
            //第一个参数 :  Bucket名称
            //第二个参数 : 上传到oss文件路径和文件名称
            //第三个参数 : 上传文件的输入流
            ossClient.putObject(bucketName, filename, inputStream);

            //关闭OSSClient
            ossClient.shutdown();

            //把上传之后文件路劲返回
            //需要手动拼接阿里云Oss 路径
            String url = "https//"+bucketName+"."+endpoint+"/"+filename;

            return url;

         catch (IOException e) 
            e.printStackTrace();
            return null;
        


    


e, filename, inputStream);

        //关闭OSSClient
        ossClient.shutdown();

        //把上传之后文件路劲返回
        //需要手动拼接阿里云Oss 路径
        String url = "https//"+bucketName+"."+endpoint+"/"+filename;

        return url;

     catch (IOException e) 
        e.printStackTrace();
        return null;
    




以上是关于阿里OSS对象---头像上传的主要内容,如果未能解决你的问题,请参考以下文章

阿里OSS对象---头像上传

J2EE分布式架构集成阿里云OSS存储

J2EE分布式架构集成阿里云OSS存储

jeesz分布式架构集成阿里云oss存储

JEESZ分布式架构集成阿里云OSS存储

J2EE分布式架构集成阿里云OSS存储