超级简单的阿里云oss使用,把我代码复制即可使用
一.需求
项目需要上传头像,不想存在本地,之前用过阿里云其他产品,这里就使用一下阿里云的oss了,不得不说阿里云的产品使用步骤真的很清晰.这里说一下我自己的使用步骤.
步骤:
1.没有阿里云账号的先去注册和认证
选择对象存储oss,进行开通
![](https://img.haomeiwen.com/i17502375/d35c7d2b2182f82f.png)
开通不要钱,有一定免费额度
![](https://img.haomeiwen.com/i17502375/5068644b84d8510f.png)
2.创建bucket,类似于文件夹
权限可以设置为公共读
![](https://img.haomeiwen.com/i17502375/a298c91e5c75b764.png)
3.可视化使用
大家可以自己去文件管理里上传一个图片试试就知道了,每个存储文件会生成一个对应的url,拿到之后我们可以从阿里云上下载下来这个图片.![](https://img.haomeiwen.com/i17502375/41c91bc8e4fae67b.png)
4.开发使用
阿里云很多小白指南非常适合我这样的菜鸡,这里有一个oss开发者使用指南,大家可以点击oss学习路径的java sdk看看,所谓sdk类似于一个说明书![](https://img.haomeiwen.com/i17502375/88c54122c82f8ae9.png)
5.参考一下阿里云 oss java sdk
其实也就是两步
1.引pom
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
<!--阿里云oss-->
2.复制黏贴大法
![](https://img.haomeiwen.com/i17502375/c8ecd66440f300f3.png)
这里写一下我使用阿里云oss的图片上传,大家可作demo参考
由于阿里云一些密钥配置和地域结点,bucket等是常量级的,所以我这里抽取出来放在了application.properties中,方便管理 ,数据我手动加密了....大家换成自己的即可,
这些配置key=value key都是自己随便写的(也不是,起码可以见名思意),只是为了我们配置的一个配置类可以利用spring的依赖注入填充value而已
#配置阿里云oss的固定值
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=XXXXXXXXXX
aliyun.oss.file.keysecret=XXXXXXXXXXXX
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=zyh-XXXXXXXXX
配置类
说明:
- 1.首先加了@Component注解使咱们的这个文件可以随着spring容器一起启动
- 2.该util类实现了InitializingBean ,可以在配置文件加载后调用afterPropertiesSet方法进行一些操作
- 3.我们这里先设置了一些private对象进行配置文件中值的依赖注入
- 4.我们这里重新定义了一些大写的常量
- 首先public使外部类(别的类)可以调用
-static使外部类可以直接通过类名.(点)调用
- 首先public使外部类(别的类)可以调用
- 在afterPropertiesSet中对常量进行赋值
package com.zyh.future.util;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//服务器启动的时候读取配置文件的内容
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//如果我们直接@value("a")是把a赋值给endpoint
//所以我们需要使用spring提供的一个方法"${a}"来获取a对应的值
@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;
//这些值赋值好了但是我们没用办法直接使用的。
//我们可以设置一些staic静态变量,这样就可以直接用类名.来调用了
public static String ENDPOINT;
public static String KEYID;
public static String KEYSECRET;
public static String BUCKETNAME;
//服务器启动就会初始化ConstantYmlUtils并且调用afterPropertiesSet方法读取配置文件的内容
@Override
public void afterPropertiesSet() throws Exception {
ENDPOINT=endpoint;
KEYID=keyid;
KEYSECRET=keysecret;
BUCKETNAME=bucketname;
}
}
Controller
说明:
我们阿里云oss仓库的url是一个咱们的仓库+固定的地域结点值+咱们的文件名字,所以这里为了使上传的文件名字不重复,使用了一个idworker,不知道的可以看一下Twitter的 Snowflake(雪花算法)
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.zyh.future.entity.Result;
import com.zyh.future.entity.StatusCode;
import com.zyh.future.util.ConstantPropertiesUtils;
import com.zyh.future.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
/**
* 功能描述: 上传文件到阿里云oss
* @Param:
* @Return:
* @Author: Zyh
* @Date: 2020/2/2 23:19
*/
@RestController
@CrossOrigin
@RequestMapping(value = "/fileupload")
public class FileUploadConteoller {
@Autowired
private IdWorker idWorker;
/**
* 功能描述: 上传用户头像
* @Param: [file]
* @Return: com.zyh.future.entity.Result 返回头像上传后在阿里云oss上的路径
* @Author: Zyh
* @Date: 2020/2/3 0:19
*/
@RequestMapping(value = "/file",method = RequestMethod.POST)
public Result fileUpload(@RequestParam("file") MultipartFile file){
/*上传文件到阿里云oss*/
// 地域结点Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = ConstantPropertiesUtils.ENDPOINT;
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,
String accessKeyId = ConstantPropertiesUtils.KEYID;
String accessKeySecret = ConstantPropertiesUtils.KEYSECRET;
String bucketName= ConstantPropertiesUtils.BUCKETNAME;
/*上传文件到阿里云oss*/
//1.使用@RequestParam("file") MultipartFile file可以接收到文件
//使用MultiparatFile 接收文件需要指定一个参数名,这个值应该是我们前端指定的input文件标签名
//2.得到上传文件的名称获取上传输入流
String filename = file.getOriginalFilename();
System.out.print("所要上传的文件名称为:"+filename);
//创建一个唯一id作为文件名字,并覆盖之前的文件名字,之前的文件名字这里只显示到console中
filename = idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
//以我手动上传的文件为例http://zyh-future.oss-cn-beijing.aliyuncs.com/IMG_6407.JPG
//前面都是固定的域https://zyh-future.oss-cn-beijing.aliyuncs.com/
/*自己拼出来在之后阿里云上的文件路径*/
String path="http://"+bucketName+"."+endpoint+"/"+filename;
try{
InputStream inputStream = file.getInputStream();
/*上传文件到阿里云oss*/
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。//参数分别为仓库名称,文件名称,文件流
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
/*上传文件到阿里云oss*/
}catch (Exception e)
{
e.printStackTrace();
return new Result(true, StatusCode.ERROR,"上传失败");
}
//返回头像在阿里云oss上的路径
return new Result(true, StatusCode.OK,"上传成功", path);
}
}
大家搭建完了可以用postman测试一下
![](https://img.haomeiwen.com/i17502375/7eb0dd11c0ea57f2.png)
ps:如果我们想方便管理或者后期扩展,我们这里也可以引入一个工具
<!--日期时间工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
我们可以用这个工具的一个方法String dirpath=new DateTime().tostring("yyyy/MM/dd");将当前的时间转换为yyyy/MM/dd的格式,比如2020/02/03
这样我们上传的文件名字时候可以以这个dirpath作为我们的图片所在的文件夹名称,以分布式id生成器生成的id为名称存储.
filename = dicpath+"/"+idWorker.nextId()+filename.substring(filename.lastIndexOf("."));
ossClient.putObject(bucketName, filename, inputStream);
下面看一下效果
![](https://img.haomeiwen.com/i17502375/7172ad3f1a8468e1.png)
![](https://img.haomeiwen.com/i17502375/d30d88f63e2c5f70.png)
网友评论