七牛云文件存储测试完毕、minio文件存储测试完毕

pull/84/head
duandazhi 4 years ago
parent b1a3f84095
commit a0d68be942

@ -44,6 +44,12 @@ public class MinioConfig {
*/ */
private String bucketName; private String bucketName;
/**
* 访; url访ip
* eg: https://image.bj.gov.cn/appt-file
*/
private String domain;
public String getUrl() { public String getUrl() {
return url; return url;
} }
@ -76,6 +82,14 @@ public class MinioConfig {
this.bucketName = bucketName; this.bucketName = bucketName;
} }
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
@Bean @Bean
public MinioClient getMinioClient() { public MinioClient getMinioClient() {
return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build(); return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();

@ -42,7 +42,6 @@ import java.util.concurrent.TimeUnit;
* @date 2019/8/6 19:02 * @date 2019/8/6 19:02
* //@see AliyunMsgUtil * //@see AliyunMsgUtil
*/ */
@Primary
@Service @Service
public class AliyunOssDsfServiceImpl implements IDfsService { public class AliyunOssDsfServiceImpl implements IDfsService {
private static final Logger log = LoggerFactory.getLogger(AliyunOssDsfServiceImpl.class); private static final Logger log = LoggerFactory.getLogger(AliyunOssDsfServiceImpl.class);
@ -64,7 +63,8 @@ public class AliyunOssDsfServiceImpl implements IDfsService {
@Override @Override
public String uploadFile(MultipartFile file, String modules) throws Exception { public String uploadFile(MultipartFile file, String modules) throws Exception {
//key: 这里不能以/开头 //key: 这里不能以/开头
String newName = validateModule(file, null); validateModule(file, null);
String newName = extractFileNameSimple(file);
//key: 这里不能以/开头 //key: 这里不能以/开头
String requestKey = "upload/" + StringUtils.defaultString(modules, "default") + "/" + newName; String requestKey = "upload/" + StringUtils.defaultString(modules, "default") + "/" + newName;
//这里增加一个前缀区分一下是测试环境还是正式环境 //这里增加一个前缀区分一下是测试环境还是正式环境
@ -153,7 +153,7 @@ public class AliyunOssDsfServiceImpl implements IDfsService {
* url * url
* *
* @param filePath https://hiber2019.oss-cn-shanghai.aliyuncs.com/upload/default/20190806202208849_jvs5g.png * @param filePath https://hiber2019.oss-cn-shanghai.aliyuncs.com/upload/default/20190806202208849_jvs5g.png
* eg2: https://react-yuebaoxiao-pro.oss-cn-shanghai.aliyuncs.com/dev//upload/default/20210717-a77f6bb0-7b0a-4ef1-a839-f8e8aca469b8.jpeg * eg2: https://react-yuebaoxiao-pro.oss-cn-shanghai.aliyuncs.com/dev/upload/default/20210717-a77f6bb0-7b0a-4ef1-a839-f8e8aca469b8.jpeg
* @return upload/default/20190806202208849_jvs5g.png * @return upload/default/20190806202208849_jvs5g.png
*/ */
private String getStorePath(String filePath) { private String getStorePath(String filePath) {

@ -86,9 +86,10 @@ public class CephDfsServiceImpl implements IDfsService {
@Override @Override
public String uploadFile(MultipartFile file, String modules) throws Exception { public String uploadFile(MultipartFile file, String modules) throws Exception {
//key: 这里不能以/开头 //key: 这里不能以/开头
String newName = validateModule(file, null); validateModule(file, modules);
String newName = extractFileNameSimple(file);
//key: 这里不能以/开头 //key: 这里不能以/开头
String requestKey = "upload/" + newName; String requestKey = "upload/" + StringUtils.defaultString(modules, "default") + "/" + newName;
//这里增加一个前缀区分一下是测试环境还是正式环境 //这里增加一个前缀区分一下是测试环境还是正式环境
boolean isProd = "prod".equalsIgnoreCase(SpringUtil.getActiveProfile()); boolean isProd = "prod".equalsIgnoreCase(SpringUtil.getActiveProfile());
if (!isProd) { if (!isProd) {

@ -29,7 +29,8 @@ public class FtpFileServiceImpl implements IDfsService {
@Override @Override
public String uploadFile(MultipartFile file, String modules) throws Exception { public String uploadFile(MultipartFile file, String modules) throws Exception {
String fileName = validateModule(file, modules); validateModule(file, modules);
String fileName = extractFileNameSimple(file);
modules = StringUtils.defaultString(modules, "default"); modules = StringUtils.defaultString(modules, "default");
String picturePath = "/upload/" + modules; String picturePath = "/upload/" + modules;

@ -2,6 +2,8 @@ package com.ruoyi.file.service;
import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException; import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException;
import com.ruoyi.common.core.exception.file.InvalidExtensionException; import com.ruoyi.common.core.exception.file.InvalidExtensionException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.IdUtils;
import com.ruoyi.common.core.utils.file.MimeTypeUtils; import com.ruoyi.common.core.utils.file.MimeTypeUtils;
import com.ruoyi.file.utils.FileUploadUtils; import com.ruoyi.file.utils.FileUploadUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -11,8 +13,7 @@ import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.ruoyi.file.utils.FileUploadUtils.assertAllowed; import static com.ruoyi.file.utils.FileUploadUtils.*;
import static com.ruoyi.file.utils.FileUploadUtils.extractFilename;
/** /**
* DFS = Distributed file system Sys File * DFS = Distributed file system Sys File
@ -71,7 +72,7 @@ public interface IDfsService
* @param modules 使;eg: bannervideomusictxtproductdefault * @param modules 使;eg: bannervideomusictxtproductdefault
* @return * @return
*/ */
default String validateModule(MultipartFile file, String modules) throws InvalidExtensionException { default void validateModule(MultipartFile file, String modules) throws InvalidExtensionException {
Objects.requireNonNull(file, "文件不能为空!"); Objects.requireNonNull(file, "文件不能为空!");
modules = StringUtils.defaultString(modules, "default"); modules = StringUtils.defaultString(modules, "default");
@ -90,6 +91,25 @@ public interface IDfsService
// 3、文件大小校验 // 3、文件大小校验
assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
return extractFilename(file); }
/**
* @return /; /20210717-a77f6bb0-7b0a-4ef1-a839-f8e8aca469b8.jpeg
*/
default String extractFileNameSimple(MultipartFile file) {
String fileName = file.getOriginalFilename();
String extension = getExtension(file);
fileName = DateUtils.dateTime() + "-" + IdUtils.fastUUID() + "." + extension;
return fileName;
}
/**
* @return / /2021/07/17/a77f6bb0-7b0a-4ef1-a839-f8e8aca469b8.jpeg
*/
default String extractFileName(MultipartFile file) {
String fileName = file.getOriginalFilename();
String extension = getExtension(file);
fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
return fileName;
} }
} }

@ -4,7 +4,9 @@ import cn.hutool.extra.spring.SpringUtil;
import com.ruoyi.common.core.exception.CustomException; import com.ruoyi.common.core.exception.CustomException;
import io.minio.RemoveObjectArgs; import io.minio.RemoveObjectArgs;
import io.minio.errors.*; import io.minio.errors.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.file.config.MinioConfig; import com.ruoyi.file.config.MinioConfig;
@ -19,13 +21,22 @@ import java.security.NoSuchAlgorithmException;
* Minio * Minio
* *
* @author ruoyi * @author ruoyi
* http://docs.minio.org.cn/docs/master/java-client-quickstart-guidec
* springboot使Minio8 https://springboot.io/t/topic/3109
* 1putObject
* 2removeObject
* ==================
* 3(Presigned)访urlstspresignedGetObject
* presignedGetObject(String bucketName, String objectName, Integer expires)
* http://docs.minio.org.cn/docs/master/java-client-api-reference#presignedGetObject
* MinIO STS http://docs.minio.org.cn/docs/master/minio-sts-quickstart-guide
*/ */
@Primary
@Service @Service
public class MinioDfsServiceImpl implements IDfsService public class MinioDfsServiceImpl implements IDfsService
{ {
@Autowired @Autowired
private MinioConfig minioConfig; private MinioConfig minioConfig;
@Autowired @Autowired
private MinioClient client; private MinioClient client;
@ -44,7 +55,8 @@ public class MinioDfsServiceImpl implements IDfsService
@Override @Override
public String uploadFile(MultipartFile file, String modules) throws Exception { public String uploadFile(MultipartFile file, String modules) throws Exception {
String fileName = validateModule(file ,modules); validateModule(file ,modules);
String fileName = StringUtils.defaultString(modules, "default") + "/" + extractFileName(file);
boolean isProd = "prod".equalsIgnoreCase(SpringUtil.getActiveProfile()); boolean isProd = "prod".equalsIgnoreCase(SpringUtil.getActiveProfile());
if (!isProd) { if (!isProd) {
fileName = SpringUtil.getActiveProfile() + "/" + fileName; fileName = SpringUtil.getActiveProfile() + "/" + fileName;
@ -57,14 +69,16 @@ public class MinioDfsServiceImpl implements IDfsService
.contentType(file.getContentType()) .contentType(file.getContentType())
.build(); .build();
client.putObject(args); client.putObject(args);
return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName; //return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
//形如https://image.bj.gov.cn/appt-file/dev/default/2021/07/18/f4243eb2-06a1-4304-bdfc-e2964b8721bb.jpeg
return minioConfig.getDomain() + "/" + minioConfig.getBucketName() + "/" + fileName;
} }
@Override @Override
public boolean deleteFile(String fileUrl) { public boolean deleteFile(String fileUrl) {
RemoveObjectArgs args = RemoveObjectArgs.builder(). RemoveObjectArgs args = RemoveObjectArgs.builder().
bucket(minioConfig.getBucketName()). bucket(minioConfig.getBucketName()).
object(fileUrl). object(getStorePath(fileUrl)).
build(); build();
try { try {
client.removeObject(args); client.removeObject(args);
@ -87,4 +101,24 @@ public class MinioDfsServiceImpl implements IDfsService
public String objectsCapacityStr() { public String objectsCapacityStr() {
throw new CustomException("minio存储-获取文件占用空间功能,敬请期待"); throw new CustomException("minio存储-获取文件占用空间功能,敬请期待");
} }
/**
* urlkey
*
* @param filePath https://image.bj.gov.cn/appt-file/dev/default/2021/07/18/f4243eb2-06a1-4304-bdfc-e2964b8721bb.jpeg
* @return dev/default/2021/07/18/f4243eb2-06a1-4304-bdfc-e2964b8721bb.jpeg
*/
private String getStorePath(String filePath) {
String oldPath = filePath;
// 处理方式1
String publicPath3 = minioConfig.getDomain() + "/" + minioConfig.getBucketName() + "/";
filePath = filePath.replace(publicPath3, "");
if (oldPath.equals(filePath)) {
// 处理方式2
String publicPath4 = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/";
filePath = filePath.replace(publicPath4, "");
}
return filePath;
}
} }

@ -12,9 +12,11 @@ import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth; import com.qiniu.util.Auth;
import com.ruoyi.common.core.exception.CustomException; import com.ruoyi.common.core.exception.CustomException;
import com.ruoyi.file.config.QiniuKodoConfig; import com.ruoyi.file.config.QiniuKodoConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -28,6 +30,7 @@ import java.io.InputStream;
* https://developer.qiniu.com/kodo/1239/java#upload-stream * https://developer.qiniu.com/kodo/1239/java#upload-stream
* ==>JAVASDK==>==> * ==>JAVASDK==>==>
*/ */
//@Primary
@Service @Service
public class QiniuDfsServiceImpl implements IDfsService { public class QiniuDfsServiceImpl implements IDfsService {
private static final Logger log = LoggerFactory.getLogger(QiniuDfsServiceImpl.class); private static final Logger log = LoggerFactory.getLogger(QiniuDfsServiceImpl.class);
@ -42,9 +45,10 @@ public class QiniuDfsServiceImpl implements IDfsService {
@Override @Override
public String uploadFile(MultipartFile file, String modules) throws Exception { public String uploadFile(MultipartFile file, String modules) throws Exception {
//key: 这里不能以/开头 //key: 这里不能以/开头
String newName = validateModule(file, null); validateModule(file, modules);
String newName = extractFileNameSimple(file);
//key: 这里不能以/开头 //key: 这里不能以/开头
String requestKey = "upload/" + "/" + newName; String requestKey = "upload/" + StringUtils.defaultString(modules, "default") + "/" + newName;
//这里增加一个前缀区分一下是测试环境还是正式环境 //这里增加一个前缀区分一下是测试环境还是正式环境
boolean isProd = "prod".equalsIgnoreCase(SpringUtil.getActiveProfile()); boolean isProd = "prod".equalsIgnoreCase(SpringUtil.getActiveProfile());
if (!isProd) { if (!isProd) {
@ -58,6 +62,7 @@ public class QiniuDfsServiceImpl implements IDfsService {
String accessKey = qiniuKodoConfig.getAccessKey(); String accessKey = qiniuKodoConfig.getAccessKey();
String secretKey = qiniuKodoConfig.getSecretKey(); String secretKey = qiniuKodoConfig.getSecretKey();
String bucket = qiniuKodoConfig.getBucketName(); String bucket = qiniuKodoConfig.getBucketName();
String domain = qiniuKodoConfig.getDomain();
//默认不指定key的情况下以文件内容的hash值作为文件名 //默认不指定key的情况下以文件内容的hash值作为文件名
String key = requestKey; String key = requestKey;
@ -68,8 +73,8 @@ public class QiniuDfsServiceImpl implements IDfsService {
Response response = uploadManager.put(byteInputStream, key, upToken, null, null); Response response = uploadManager.put(byteInputStream, key, upToken, null, null);
//解析上传成功的结果 //解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key); /// http://guangdong-oss.ityun.ltd/dev/upload/default/20210717-133e3b4a-6aad-418c-a040-7161fa37ee49.jpeg
System.out.println(putRet.hash); return (domain + "/" + putRet.key).replace("//", "/") ;
} catch (QiniuException ex) { } catch (QiniuException ex) {
Response r = ex.response; Response r = ex.response;
String json = null; String json = null;
@ -98,6 +103,7 @@ public class QiniuDfsServiceImpl implements IDfsService {
String key = getStorePath(fileUrl); String key = getStorePath(fileUrl);
try { try {
bucketManager.delete(bucket, key); bucketManager.delete(bucket, key);
return true;
} catch (QiniuException ex) { } catch (QiniuException ex) {
//如果遇到异常,说明删除失败 //如果遇到异常,说明删除失败
log.error("【七牛云】-删除文件-失败 code" + ex.code() + "=>" + ex.response.toString()); log.error("【七牛云】-删除文件-失败 code" + ex.code() + "=>" + ex.response.toString());
@ -137,7 +143,8 @@ public class QiniuDfsServiceImpl implements IDfsService {
/// 其中关于Region对象和机房的关系如下 /// 其中关于Region对象和机房的关系如下
///Region region = Region.autoRegion(); ///Region region = Region.autoRegion();
///Region region = Region.region0(); ///Region region = Region.region0();
///Region region = Region.huanan();
//构造一个带指定 Region 对象的配置类 //构造一个带指定 Region 对象的配置类
return Region.huadong(); return Region.autoRegion();
} }
} }

@ -50,10 +50,11 @@ fdfs:
# 文件服务器之4 Minio配置 # 文件服务器之4 Minio配置
minio: minio:
url: http://192.168.254.100:9900 url: http://10.16.58.152:9000
accessKey: D99KGE6ZTQXSATTJWU24 accessKey: D99KGE6ZTQXSATTJWU24
secretKey: QyVqGnhIQQE734UYSUFlGOZViE6+ZlDEfUG3NjhJ secretKey: QyVqGnhIQQE734UYSUFlGOZViE6+ZlDEfUG3NjhJ
bucketName: neusoft-appt bucketName: appt-file
domain: https://image.bj.gov.cn
# 文件服务器之5 aliyun oss # 文件服务器之5 aliyun oss
aliyun-oss: aliyun-oss:
@ -63,3 +64,9 @@ aliyun-oss:
endpoint: oss-cn-shanghai.aliyuncs.com endpoint: oss-cn-shanghai.aliyuncs.com
domain: https://react-yuebaoxiao-pro.oss-cn-shanghai.aliyuncs.com domain: https://react-yuebaoxiao-pro.oss-cn-shanghai.aliyuncs.com
# 文件服务器之6 qiniu 七牛 kodo
qiniu:
access-key: pRYrSe_EW4sJHsQ6JyuiRYShA2JCLKtMhT-N4TQD
secret-key: CwTEh1kSLBdxBhIWfFz6h1GgDSokx97CYEV0cC1O
bucket-name: guangdong-oss
domain: http://guangdong-oss.ityun.ltd

Loading…
Cancel
Save