Spring boot使用阿里云的Oss文件存储
1、准备环境
-
阿里云准备
- 去阿里云创建一个OSS文件存储对象的项目(阿里云创建不超过1g的文件,不要钱)
- 根据提示创建一个文件夹(这里可以看看他们文档)
- 把我们的所有文件访问为公共,提示直接确定
- 获取oss项目中的accessKeyId、accessKeySecret
-
springboot准备
- 引入oss
<!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency>
2、自定义配置key
#阿里云的oss不同的服务器,地址不同
oss.endpoint=oss-cn-beijing.aliyuncs.com
oss.accessKeyId=xxxx
oss.accessKeySecret=xxxx
oss.bucketName=你的创建的bucket对象,不是文件夹
注意:
- 可能会报警告,这个因为是自定义的,使用才报黄
- 处理keyId和Secret不一样,其他基本一致
- 链接使用外网
3、准备一个OSS的工具类,来操作文件
package com.tmm.tmmhome.utils;
/**
* @Author Tommy
* 2020/11/22
*/
@Component
@Slf4j
public class OssManagerUtil {
//------------------变量----------
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.accessKeyId}")
private String accessKeyId;
@Value("${oss.accessKeySecret}")
private String accessKeySecret;
@Value("${oss.bucketName}")
private String bucketName;
private static String FILE_URL;
/**
* @param file 上传的文件
* @param upPath 上传的路径
* @param fileName 创建的文件名(包括后缀)
* @return
*/
public String upLoad(File file, String upPath, String fileName) {
// 默认值为:true
boolean isImage = true;
// 判断所要上传的图片是否是图片,图片可以预览,其他文件不提供通过URL预览
try {
Image image = ImageIO.read(file);
isImage = image == null ? false : true;
} catch (IOException e) {
e.printStackTrace();
}
log.debug("------OSS文件上传开始--------" + file.getName());
// 文件名格式
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
// String dateString = sdf.format(new Date()) + "." + suffix; // 20180322010634.jpg
// 判断文件
if (file == null) {
return null;
}
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
// 判断容器是否存在,不存在就创建
if (!ossClient.doesBucketExist(bucketName)) {
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
// 设置文件路径和名称
// String fileUrl = fileHost + "/" + (dateString + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
String fileUrl = upPath + "/" + fileName;
// 上传文件
PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
// 设置权限(公开读)
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
if (result != null) {
//上传成功后拼接地址
if (isImage) {//如果是图片,则图片的URL为:....
FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl;
} else {
FILE_URL = fileUrl;
log.debug("非图片,不可预览。文件路径为:" + fileUrl);
}
log.debug("------OSS文件上传成功------" + fileUrl);
}
} catch (OSSException oe) {
log.debug(oe.getMessage());
} catch (ClientException ce) {
log.debug(ce.getErrorMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return FILE_URL;
}
/**
* 通过文件名下载文件
*
* @param objectName 要下载的文件名
* @param localFileName 本地要创建的文件名
*/
public void downloadFile(String objectName, String localFileName) {
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
// 关闭OSSClient。
ossClient.shutdown();
}
/**
* 删除文件
* objectName key 地址
*
* @param filePath
*/
public Boolean delFile(String filePath) {
log.debug("删除开始,objectName=" + filePath);
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 删除Object.
boolean exist = ossClient.doesObjectExist(bucketName, filePath);
if (!exist) {
log.debug("文件不存在,filePath={}", filePath);
return false;
}
log.debug("删除文件,filePath={}", filePath);
ossClient.deleteObject(bucketName, filePath);
ossClient.shutdown();
return true;
}
/**
* 批量删除
*
* @param keys
*/
public Boolean delFileList(List<String> keys) {
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
// 删除文件。
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
ossClient.shutdown();
}
return true;
}
/**
* 获取文件夹
*
* @param fileName
* @return
*/
public List<String> fileFolder(String fileName) {
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 构造ListObjectsRequest请求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 设置正斜线(/)为文件夹的分隔符。
listObjectsRequest.setDelimiter("/"); //文件文件夹
// 设置prefix参数来获取fun目录下的所有文件。
if (StringUtils.isNotBlank(fileName)) {
listObjectsRequest.setPrefix(fileName + "/");
}
// 列出文件
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍历所有commonPrefix
List<String> list = new ArrayList<>();
for (String commonPrefix : listing.getCommonPrefixes()) {
String newCommonPrefix = commonPrefix.substring(0, commonPrefix.length() - 1);
String[] s = newCommonPrefix.split("/");
list.add(s[1]);
}
// 关闭OSSClient
ossClient.shutdown();
return list;
}
/**
* 列举文件下所有的文件url信息
*/
public List<String> listFile(String fileHost) {
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 构造ListObjectsRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 设置prefix参数来获取fun目录下的所有文件。
listObjectsRequest.setPrefix(fileHost + "/");
listObjectsRequest.setDelimiter("/"); //如果这个值为空,则获取文件夹里所有文件,包括子文件
// 列出文件。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍历所有文件。
List<String> list = new ArrayList<>();
for (int i = 0; i < listing.getObjectSummaries().size(); i++) {
if (i == 0) {
continue;
}
FILE_URL = "https://" + bucketName + "." + endpoint + "/" + listing.getObjectSummaries().get(i).getKey();
list.add(FILE_URL);
}
// 关闭OSSClient。
ossClient.shutdown();
return list;
}
/**
* 获得url链接
*
* @param objectName
* @return
*/
public String getUrl(String objectName) {
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 设置权限(公开读)
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
// 设置图片处理样式。
// String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 100);
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
req.setExpiration(expiration);
// req.setProcess(style);
URL signedUrl = ossClient.generatePresignedUrl(req);
// 关闭OSSClient。
log.debug("------OSS文件文件信息--------" + signedUrl.toString());
ossClient.shutdown();
if (signedUrl != null) {
return signedUrl.toString();
}
return null;
}
// 获取文 MultipartFile 文件后缀名工具
public static String getSuffix(MultipartFile fileupload) {
String originalFilename = fileupload.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
System.out.println(suffix);
return suffix;
}
/**
* 创建文件夹
*
* @param folder
* @return
*/
public String createFolder(String folder) {
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 文件夹名
final String keySuffixWithSlash = folder;
// 判断文件夹是否存在,不存在则创建
if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {
// 创建文件夹
ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
log.debug("创建文件夹成功");
// 得到文件夹名
OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
String fileDir = object.getKey();
ossClient.shutdown();
return fileDir;
}
return keySuffixWithSlash;
}
}
注意:
- 头部的加上注解Component
- 前方属性获取完美配置文件中的值
4、使用工具上传文件
//----------测试阿里oss
//注入工具类
@Autowired
OssManagerUtil ossManagerUtil;
@PostMapping("/testALoss")
@ApiOperation(value = "测试阿里的Oss上传文件")
public Map testALoss(MultipartFile file){
Map returnbody = new HashMap();
//上传文件
String s = ossManagerUtil.upLoad(new File(), "tommy/img", "a.png");
//删除文件
Boolean aBoolean = ossManagerUtil.delFile("tommy/img/a.png");
//获取当前文件列表并转为url
List lists = ossManagerUtil.listFile('tommy/img');//获取用户图片所有url
returnbody.put("成功",s.toString()); //返回一个url
return returnbody;
}
- 这里的tommy是根目录的文件夹