写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。
技术是开源的、知识是共享的。
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活
。
1、pom.xml 中添加依赖
<!--aliyunOSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
<!--日期时间工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
2、配置application.properties
#不同的服务器,地址不同
aliyun.oss.file.endpoint=your endpoint
aliyun.oss.file.keyid=your accessKeyId
aliyun.oss.file.keysecret=your accessKeySecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=your bucketname
3、从配置文件读取常量
常量类,在服务器启动的时候,读取配置文件application.properties中的配置。
使用@Value读取application.properties里的配置内容,用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。
@Component
public class ConstantPropertiesUtil 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 ENDPOINT;
public static String KEYID;
public static String KEYSECRET;
public static String BUCKETNAME;
/**
* 服务器启动的时候,ConstantPropertiesUtil初始化,调用里面的afterPropertiesSet方法,读取配置文件的内容
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
ENDPOINT = endPoint;
KEYID = keyId;
KEYSECRET = keySecret;
BUCKETNAME = bucketName;
}
}
4、实现文件上传
定义具体的数据返回格式
@Data
public class R {
private Boolean success; // 响应是否成功
private Integer code; // 状态码
private String message; // 返回信息
private Map<String, Object> data = new HashMap<>(); // 返回数据,放在键值对中
private R() {
}
/**
* 操作成功,调用这个方法
*
* @return 返回成功的数据
*/
public static R ok() {
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.SUCCESS);
r.setMessage("操作成功");
return r;
}
/**
* 操作失败,调用这个方法
*
* @return 返回失败的数据
*/
public static R error() {
R r = new R();
r.setSuccess(false);
r.setCode(ResultCode.ERROR);
r.setMessage("操作失败");
return r;
}
// 使用链式编程
public R success(Boolean success) {
this.setSuccess(success);
return this;
}
public R message(String message) {
this.setMessage(message);
return this;
}
public R code(Integer code) {
this.setCode(code);
return this;
}
public R data(String key, Object value) {
this.data.put(key, value);
return this;
}
public R data(Map<String, Object> map) {
this.setData(map);
return this;
}
}
上传文件的Controller
@RestController
@RequestMapping("/user/oss")
@CrossOrigin // 解决跨域
public class FileUploadController {
/**
* 上传文件
*
* @return
*/
@PostMapping("upload")
public R uploadTeacherImg(@RequestParam("file") MultipartFile file) {
// 地域节点
String endpoint = ConstantPropertiesUtil.ENDPOINT;
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
String accessKeyId = ConstantPropertiesUtil.KEYID;
String accessKeySecret = ConstantPropertiesUtil.KEYSECRET;
// BucketName
String yourBucketName = ConstantPropertiesUtil.BUCKETNAME;
try {
// 1.获取上传文件 MultipartFile file
// @RequestParam("file") file 与表单输入项的name值保持一致
// 2.获取上传文件名称,获取上传文件输入流
String fileName = file.getOriginalFilename();
// 在文件名称之前添加uuid值,保证文件名称不重复
String uuid = UUID.randomUUID().toString();
fileName = uuid + fileName;
// 获取当前日期 2020/01/03
String filePath = new DateTime().toString("yyyy/MM/dd");
// 拼接文件完整路径 2020/01/03/parker.jpg
fileName = filePath + "/" + fileName;
// 获取上传文件输入流
InputStream in = file.getInputStream();
// 3.把上传文件存储到阿里云oss里面
// 创建OSSClient实例。
OSS ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 上传文件流
// 第一个参数时BucketName,第二个参数是文件名称,第三个参数是输入流
ossClient.putObject(yourBucketName, fileName, in);
// 关闭OSSClient。
ossClient.shutdown();
// 返回上传之后的oss存储路径
String path = "http://" + yourBucketName + "." + endpoint + "/" + fileName;
return R.ok().data("imgurl", path);
} catch (Exception e) {
e.printStackTrace();
return R.error();
}
}
}
由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!
转载:https://blog.csdn.net/weixin_43570367/article/details/103863717
查看评论