提示:这是我的个人IT资源网站,所有资源都免费,注册登录后就可以看到密码,需要什么大家尽情选取!
在项目中不管是上传文件还是图片,我们一般会选择上传到服务器,那么当我们想访问上传的文件或图片时,需要搭建WEB服务器对文件或图片进行映射,才能被外界访问,这时会产生两个问题,一是肯定会增加对服务器的访问请求,二是肯定会占用服务器的存储,其实除了存储在我们的服务器上这个方案外,还可以上传到可靠的第三方平台,我最近使用了阿里的OSS服务,感觉挺好使,所以在这里总结一下,并推荐给大家,有两个优点,一是提供各种语言的SDK,所以集成起来特别方便,二是阿里目前是国内的技术龙头,企业或者个人服务器很多都是使用阿里云服务器,所以在稳定性和安全性上毫无置疑,这样可以将一些文件图片的访问转移到阿里提供的OSS服务,一举两得,但是毕竟是用人家的服务,虽然有免费存储空间,但是有限,如果小体量的话,应该够用,大体量,我觉着也不差这点钱了,哈哈,下面我就一步一步介绍一下,如何将阿里的OSS服务集成到我们的SpringBoot项目中
-
首先肯定是登录阿里云了,现在都需要实名认证,可以通过支付宝登录,支付宝大家应该都有,而且信息互通,所以一登录就相当于实名认证了
-
登录进去,我们找到OSS服务,点击进去
-
然后点击右侧,创建一个Bucket,就像一个存储空间
-
然后填写Bucket内容,主要填写名称和选择地域,还有一个读写权限,如果是一些公共都可以访问的图片或文件,就直接选择公共读
-
创建之后,就可以在Bucket列表看到了
-
下面我们就来集成到我们的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