最开始先写了工具类OSSUtil
第一版是在静态代码块中初始化 OSS ossclient
但是因为是工具类 所以好多东西是在application.yml里配置的
通过@value注入不进来(因为static是在类声明的时候执行的, 所以配置信息还没有注入)
后来改成了OSSConfiguration 配置的形式 下面直接上代码
OSSUtil
package com.hzt.intellect.utils;
import com.aliyun.oss.*;
import com.aliyun.oss.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
/**
* 阿里oss工具类
* author yjj 2022-03-04
*
*/
@Slf4j
public class OSSUtil {
private static OSS ossclient=null;
private static OSSConfig ossConfig;
public OSSUtil(OSSConfig ossConfig){
Assert.hasText(ossConfig.getAccessKeyId(), "accessKey不能为空");
Assert.hasText(ossConfig.getAccessKeySecret(), "secret不能为空");
Assert.hasText(ossConfig.getBucketName(), "bucketName不能为空");
Assert.hasText(ossConfig.getEndpoint(), "endpoint不能为空");
Assert.notNull(ossConfig.getCount(), "count不能为空");
Assert.notNull(ossConfig.getOutTime(), "outTime不能为空");
this.ossConfig = ossConfig;
init();
}
/**
* 获取阿里云OSS客户端对象
*
* return ossClient
*/
private void init() {
//设置超时机制和重试机制
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(ossConfig.getOutTime());
conf.setMaxErrorRetry(ossConfig.getCount());
ossclient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
}
/**
* 创建模拟文件夹
*
* param ossClient oss连接
* param bucketName 存储空间
* param folder 模拟文件夹名如"qj_nanjing/"
* return 文件夹名
*/
public String createFolder(String folder) {
// 文件夹名
final String keySuffixWithSlash = folder;
// 判断文件夹是否存在,不存在则创建
if (!ossclient.doesObjectExist(ossConfig.getBucketName(), keySuffixWithSlash)) {
// 创建文件夹
ossclient.putObject(ossConfig.getBucketName(), keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
log.info("创建文件夹成功");
// 得到文件夹名
OSSObject object = ossclient.getObject(ossConfig.getBucketName(), keySuffixWithSlash);
String fileDir = object.getKey();
return fileDir;
}
return keySuffixWithSlash;
}
/**
* 根据key删除OSS服务器上的文件
*
* param ossClient oss连接
* param bucketName 存储空间
* param folder 模拟文件夹名 如"wenjian/"
* param key 文件名 如:"test.jpg"
*/
public void deleteFile(String folder, String key) {
ossclient.deleteObject(ossConfig.getBucketName(), folder + key);
log.info("删除" + ossConfig.getBucketName() + "下的文件" + folder + key + "成功");
}
/**
* 上传文件。
*
* @param file 需要上传的文件路径
* @return 如果上传的文件是图片的话,会返回图片的"URL",如果非图片的话会返回"非图片,不可预览。文件路径为:+文件路径"
*/
public String upLoad(File file, String fileHost) {
String reFileUrl = "";
// 默认值为:true
boolean isImage = true;
// 判断所要上传的图片是否是图片,图片可以预览,其他文件不提供通过URL预览
try {
Image image = ImageIO.read(file);
isImage = image == null ? false : true;
} catch (IOException e) {
e.printStackTrace();
}
log.info("------OSS文件上传开始--------" + file.getName());
// 判断文件
if (file == null) {
return null;
}
try {
// 判断容器是否存在,不存在就创建
if (!ossclient.doesBucketExist(ossConfig.getBucketName())) {
ossclient.createBucket(ossConfig.getBucketName());
CreateBucketRequest createBucketRequest = new CreateBucketRequest(ossConfig.getBucketName());
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossclient.createBucket(createBucketRequest);
}
// 设置文件路径和名称
String fileUrl = fileHost + "/" + file.getName();
if (isImage) {//如果是图片,则图片的URL为:....
reFileUrl = "https://" + ossConfig.getBucketName() + "." + ossConfig.getEndpoint() + "/" + fileUrl;
} else {
reFileUrl = fileUrl;
log.info("非图片,不可预览。文件路径为:" + fileUrl);
}
// 上传文件
PutObjectResult result = ossclient.putObject(new PutObjectRequest(ossConfig.getBucketName(), fileUrl, file));
// 设置权限(公开读)
ossclient.setBucketAcl(ossConfig.getBucketName(), CannedAccessControlList.PublicRead);
if (result != null) {
log.info("------OSS文件上传成功------" + fileUrl);
}
} catch (OSSException oe) {
log.error(oe.getMessage());
} catch (ClientException ce) {
log.error(ce.getErrorMessage());
} finally {
if (ossclient != null) {
ossclient.shutdown();
}
}
return reFileUrl;
}
/**
* 通过文件名下载文件
*
* @param objectName 要下载的文件名
* @param localFileName 本地要创建的文件名(不要后缀)
*/
public void downloadFile(String objectName, String localFileName) {
try {
String suffix = objectName.substring(objectName.lastIndexOf("."));
if (suffix != null && !"".equals(suffix)){
localFileName = localFileName.concat(suffix);
}
}catch (Exception e){
log.error("文件未检测到后缀名称:{}", objectName);
}
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
ossclient.getObject(new GetObjectRequest(ossConfig.getBucketName(), objectName), new File(localFileName));
// 关闭OSSClient。
ossclient.shutdown();
}
}
OSSConfig
package com.hzt.intellect.utils;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
public class OSSConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private Integer count;
private Integer outTime;
}
OSSConfiguration
package com.hzt.intellect.config;
import com.hzt.intellect.utils.OSSConfig;
import com.hzt.intellect.utils.OSSUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OSSConfiguration {
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.accessKeyId}")
private String accessKeyId;
@Value("${oss.accessKeySecret}")
private String accessKeySecret;
@Value("${oss.bucketName}")
private String bucketName;
@Value("${oss.count}")
private Integer count;
@Value("${oss.outTime}")
private Integer outTime;
@Bean
public OSSUtil OSSUtil() {
OSSConfig ossConfig = new OSSConfig();
ossConfig.setAccessKeyId(accessKeyId);
ossConfig.setAccessKeySecret(accessKeySecret);
ossConfig.setBucketName(bucketName);
ossConfig.setCount(count);
ossConfig.setEndpoint(endpoint);
ossConfig.setOutTime(outTime);
return new OSSUtil(ossConfig);
}
}
配置
使用
@Autowired
OSSUtil ossUtil;
@RequestMapping("/test")
public Result test() {
try {
File file =new File("D:\\test\\test.docx");
return Result.ok(ossUtil.upLoad(file, "test"));
} catch (Exception e) {
e.printStackTrace();
return Result.error("异常");
}
}