阿里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对象---头像上传的主要内容,如果未能解决你的问题,请参考以下文章