和传统的单体应用不同,这里我们选择将数据上传到分布式文件服务器上。
这里我们选择将图片放置到阿里云上,使用对象存储。
阿里云上使使用对象存储方式:
创建Bucket
endpoint的取值:
accessKeyId和accessKeySecret需要创建一个RAM账号:
创建用户完毕后,会得到一个“AccessKey ID”和“AccessKeySecret”,然后复制这两个值到代码的“AccessKey ID”和“AccessKeySecret”。
另外还需要添加访问控制权限
配置yml文件 ,
# 阿里云 OSS
# 外网访问的Endpoint(地域节点)(下方实例是北京,改成你自己的)
# 不同的服务器,地址不同 !!!注意不要加空格!!!
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=填你的AccessKey ID
aliyun.oss.file.keysecret=填你的AccessKey Secret
# bucket可以在控制台创建 也可以使用java代码创建
aliyun.oss.file.bucketname=你的Bucket名称
package com.fullstar.sjps.xcjc.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* 阿里云服务
*
* @author cf
* @date 2022-06-15 11:41
*/
@Component
public class OSSUtils {
private static String ENDPOINT;
private static String ACCESS_KEY_ID;
private static String ACCESS_KEY_SECRET;
private static String BUCKET_NAME;
private static String SUFFER_URL;
private static String PARENT_DIR;
@Value("${OSS.endpoint}")
public void setENDPOINT(String endpoint) {
OSSUtils.ENDPOINT = endpoint;
}
@Value("${OSS.accessKeyId}")
public void setAccessKeyId(String accessKeyId) {
OSSUtils.ACCESS_KEY_ID = accessKeyId;
}
@Value("${OSS.accessKeySecret}")
public void setAccessKeySecret(String accessKeySecret) {
OSSUtils.ACCESS_KEY_SECRET = accessKeySecret;
}
@Value("${OSS.bucketName}")
public void setBucketName(String bucketName) {
OSSUtils.BUCKET_NAME = bucketName;
}
@Value("${OSS.suffurl}")
public void setSufferUrl(String suffurl) {
OSSUtils.SUFFER_URL = suffurl;
}
@Value("${OSS.parentDir}")
public void setParentDir(String parentDir) {
OSSUtils.PARENT_DIR = parentDir;
}
/**
* 上传单张图片
*
* @param file
* @param dirPath 父文件夹名称
* @return 上传成功返回存储路径,失败返回null
*/
public static String uploadFile(MultipartFile file, String dirPath) {
// 获取源文件名称
String fileName = file.getOriginalFilename();
// 获取源文件后缀名
String etx = fileName.substring(fileName.lastIndexOf("."));
// 生成存储路径
String filePath = PARENT_DIR + "/" + dirPath + "/" + UUID.randomUUID().toString().replaceAll("-", "") + etx;
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
// 上传图片
PutObjectResult result = ossClient.putObject(BUCKET_NAME, filePath, new ByteArrayInputStream(CompressUtils.compressPicForScale(file.getBytes(), 64)));
// 设置私有权限读写
// ossClient.setBucketAcl(BUCKET_NAME, CannedAccessControlList.Default);
} catch (Exception e) {
e.printStackTrace();
filePath = null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return filePath;
}
public static String uploadAllFile(MultipartFile file, String dirPath) {
// 获取源文件名称
String fileName = file.getOriginalFilename();
// 获取源文件后缀名
String etx = fileName.substring(fileName.lastIndexOf("."));
// 生成存储路径
String filePath = PARENT_DIR + "/" + dirPath + "/" + UUID.randomUUID().toString().replaceAll("-", "") + etx;
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
// 上传文件
PutObjectResult result = ossClient.putObject(BUCKET_NAME, filePath, new BufferedInputStream(file.getInputStream()));
// 设置私有权限读写
// ossClient.setBucketAcl(BUCKET_NAME, CannedAccessControlList.Default);
} catch (Exception e) {
e.printStackTrace();
filePath = null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return filePath;
}
/**
* 上传多张图片
*
* @param files
* @param dirPath 父文件夹名称
* @return 所有文件上传成功返回存储路径集合,任意一个文件上传失败返回null
*/
public static List<String> uploadFiles(MultipartFile[] files, String dirPath) {
List<String> filePaths = new ArrayList<>();
for (int i = 0; i < files.length; i++) {
String filePath = uploadFile(files[i], dirPath);
if (filePath == null) {
if (!filePaths.isEmpty()) {
deleteFiles(filePaths);
}
return null;
}
filePaths.add(filePath);
}
return filePaths;
}
/**
* 批量删除文件
*
* @param filePaths
*/
public static void deleteFiles(List<String> filePaths) {
if (CollectionUtils.isEmpty(filePaths)) return;
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
filePaths.forEach((item) -> {
if (StringUtils.isNotEmpty(item))
ossClient.deleteObject(BUCKET_NAME, item);
});
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 删除单个文件
*
* @param filePath
*/
public static void deleteFile(String filePath) {
if (StringUtils.isEmpty(filePath)) return;
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
ossClient.deleteObject(BUCKET_NAME, filePath);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 获取图片完整权限路径
*
* @param filePath 图片存储路径
* @param expiration 过期时间
* @return
*/
public static String getImgUrl(String filePath, Date expiration) {
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
String imgPath = ossClient.generatePresignedUrl(BUCKET_NAME, filePath, expiration).toString();
ossClient.shutdown();
return imgPath;
}
/**
* 获取过期时间,默认一个月有效
*
* @return
*/
public static LocalDateTime getExpiration() {
LocalDateTime now = LocalDateTime.now();
return now.plusMonths(1);
}
}