fix: 文件删除根据文件路径获取文件名考虑自定义域名的情况

This commit is contained in:
haoxr
2023-06-04 08:26:18 +08:00
parent 78f8d737fb
commit 832d36ff7a
3 changed files with 33 additions and 33 deletions

View File

@@ -4,9 +4,7 @@ import com.youlai.system.model.dto.FileInfo;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
/** /**
* 文件接口 * 对象存储服务接口
* <p>
* 已实现 MinIO
* *
* @author haoxr * @author haoxr
* @since 2022/11/19 * @since 2022/11/19
@@ -16,15 +14,15 @@ public interface OssService {
/** /**
* 上传文件 * 上传文件
* @param file 表单文件对象 * @param file 表单文件对象
* @return * @return 文件信息
*/ */
FileInfo uploadFile(MultipartFile file); FileInfo uploadFile(MultipartFile file);
/** /**
* 删除文件 * 删除文件
* *
* @param filePath * @param filePath 文件完整URL
* @return * @return 删除结果
*/ */
boolean deleteFile(String filePath); boolean deleteFile(String filePath);

View File

@@ -8,7 +8,6 @@ import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.youlai.system.model.dto.FileInfo; import com.youlai.system.model.dto.FileInfo;
import com.youlai.system.service.OssService; import com.youlai.system.service.OssService;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
@@ -69,33 +68,30 @@ public class AliyunOssService implements OssService {
String fileName = DateUtil.format(LocalDateTime.now(), "yyyy/MM/dd") + "/" + uuid + "." + suffix; String fileName = DateUtil.format(LocalDateTime.now(), "yyyy/MM/dd") + "/" + uuid + "." + suffix;
// try-with-resource 语法糖自动释放流 // try-with-resource 语法糖自动释放流
try (InputStream inputStream = file.getInputStream()) { try (InputStream inputStream = file.getInputStream()) {
// 创建PutObjectRequest对象指定Bucket名称、对象名称和输入流
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream);
// 设置上传文件的元信息例如Content-Type // 设置上传文件的元信息例如Content-Type
ObjectMetadata metadata = new ObjectMetadata(); ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(file.getContentType()); metadata.setContentType(file.getContentType());
putObjectRequest.setMetadata(metadata); // 创建PutObjectRequest对象指定Bucket名称、对象名称和输入流
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream, metadata);
// 上传文件 // 上传文件
PutObjectResult putObjectResult = aliyunOssClient.putObject(putObjectRequest); aliyunOssClient.putObject(putObjectRequest);
} catch (Exception e) {
throw new RuntimeException("文件上传失败");
}
// 获取文件访问路径 // 获取文件访问路径
String fileUrl = "https://" + bucketName + ".oss-cn-hangzhou.aliyuncs.com/" + fileName; String fileUrl = "https://" + bucketName + "." + endpoint + "/" + fileName;
FileInfo fileInfo = new FileInfo(); FileInfo fileInfo = new FileInfo();
fileInfo.setName(fileName); fileInfo.setName(fileName);
fileInfo.setUrl(fileUrl); fileInfo.setUrl(fileUrl);
return fileInfo; return fileInfo;
} catch (Exception e) {
throw new RuntimeException("文件上传失败");
}
} }
@Override @Override
public boolean deleteFile(String filePath) { public boolean deleteFile(String filePath) {
Assert.notBlank(filePath, "删除文件路径不能为空"); Assert.notBlank(filePath, "删除文件路径不能为空");
String tempStr = "/" + bucketName + "/"; String fileHost = "https://" + bucketName + "." + endpoint; // 文件主机域名
String fileName = filePath.substring(filePath.indexOf(tempStr) + tempStr.length()); // 2022/11/20/test.jpg String fileName = filePath.substring(fileHost.length() + 1); // +1 是/占一个字符,截断左闭右开
aliyunOssClient.deleteObject(bucketName, fileName); aliyunOssClient.deleteObject(bucketName, fileName);
return true; return true;
} }

View File

@@ -37,7 +37,7 @@ import java.time.LocalDateTime;
public class MinioOssService implements OssService { public class MinioOssService implements OssService {
/** /**
* 服务Endpoint * 服务Endpoint(http://localhost:9000)
*/ */
private String endpoint; private String endpoint;
/** /**
@@ -53,7 +53,7 @@ public class MinioOssService implements OssService {
*/ */
private String bucketName; private String bucketName;
/** /**
* 自定义域名 * 自定义域名(https://oss.youlai.tech)
*/ */
private String customDomain; private String customDomain;
@@ -81,7 +81,7 @@ public class MinioOssService implements OssService {
// 生成文件名(日期文件夹) // 生成文件名(日期文件夹)
String suffix = FileUtil.getSuffix(file.getOriginalFilename()); String suffix = FileUtil.getSuffix(file.getOriginalFilename());
String uuid = IdUtil.simpleUUID(); String uuid = IdUtil.simpleUUID();
String fileName = DateUtil.format(LocalDateTime.now(), "yyyy/MM/dd") + "/" + uuid + "." + suffix; String fileName = DateUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + uuid + "." + suffix;
// try-with-resource 语法糖自动释放流 // try-with-resource 语法糖自动释放流
try (InputStream inputStream = file.getInputStream()) { try (InputStream inputStream = file.getInputStream()) {
// 文件上传 // 文件上传
@@ -121,27 +121,33 @@ public class MinioOssService implements OssService {
* 删除文件 * 删除文件
* *
* @param filePath 文件路径 * @param filePath 文件路径
* https://oss.youlai.tech/default/2022/11/20/test.jpg * https://oss.youlai.tech/default/20221120/test.jpg
* @return * @return
*/ */
@Override @Override
public boolean deleteFile(String filePath) { public boolean deleteFile(String filePath) {
Assert.notBlank(filePath, "删除文件路径不能为空"); Assert.notBlank(filePath, "删除文件路径不能为空");
String tempStr = "/" + bucketName + "/"; try {
String fileName = filePath.substring(filePath.indexOf(tempStr) + tempStr.length()); // 2022/11/20/test.jpg String fileName;
if (StrUtil.isNotBlank(customDomain)) {
// https://oss.youlai.tech/default/20221120/test.jpg → 20221120/test.jpg
fileName = filePath.substring(customDomain.length() + 1 + bucketName.length() + 1); // 两个/占了2个字符长度
} else {
// http://localhost:9000/default/20221120/test.jpg → 20221120/test.jpg
fileName = filePath.substring(endpoint.length() + 1 + bucketName.length() + 1);
}
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder() RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder()
.bucket(bucketName) .bucket(bucketName)
.object(fileName) .object(fileName)
.build(); .build();
try {
minioClient.removeObject(removeObjectArgs); minioClient.removeObject(removeObjectArgs);
return true;
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException |
XmlParserException e) { XmlParserException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
return true;
} }