diff --git a/build.gradle b/build.gradle index b8168a9..2079785 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' // Lombok 注解处理 testImplementation 'org.springframework.boot:spring-boot-starter-test' // 测试框架 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' // thymeleaf模版引擎 - implementation 'com.aliyun.oss:aliyun-sdk-oss:3.17.4' // OSS SDK + implementation 'com.aliyun.oss:aliyun-sdk-oss:3.18.1' // OSS SDK } tasks.named('test') { diff --git a/src/main/java/com/corewing/app/modules/admin/biz/BizFirmwareController.java b/src/main/java/com/corewing/app/modules/admin/biz/BizFirmwareController.java index d7b2c70..ff65f92 100644 --- a/src/main/java/com/corewing/app/modules/admin/biz/BizFirmwareController.java +++ b/src/main/java/com/corewing/app/modules/admin/biz/BizFirmwareController.java @@ -71,8 +71,8 @@ public class BizFirmwareController { */ @DeleteMapping("/delete") @ResponseBody - public Result delete(String id) { - return Result.isBool(firmwareService.removeById(id)); + public Result delete(Long id) { + return Result.isBool(firmwareService.removeData(id)); } /** @@ -97,4 +97,6 @@ public class BizFirmwareController { return Result.isBool(firmwareService.uploadFile(file, id)); } + + } diff --git a/src/main/java/com/corewing/app/service/FirmwareService.java b/src/main/java/com/corewing/app/service/FirmwareService.java index 222ebab..bb57718 100644 --- a/src/main/java/com/corewing/app/service/FirmwareService.java +++ b/src/main/java/com/corewing/app/service/FirmwareService.java @@ -33,4 +33,11 @@ public interface FirmwareService extends IService { * @return */ boolean uploadFile(MultipartFile file, Long id); + + /** + * 根据id删除固件 + * @param id + * @return + */ + boolean removeData(Long id); } diff --git a/src/main/java/com/corewing/app/service/impl/FirmwareServiceImpl.java b/src/main/java/com/corewing/app/service/impl/FirmwareServiceImpl.java index 01d2cdc..408f633 100644 --- a/src/main/java/com/corewing/app/service/impl/FirmwareServiceImpl.java +++ b/src/main/java/com/corewing/app/service/impl/FirmwareServiceImpl.java @@ -9,6 +9,7 @@ import com.corewing.app.mapper.FirmwareMapper; import com.corewing.app.service.FirmwareService; import com.corewing.app.util.OSSUploadUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; @@ -49,5 +50,62 @@ public class FirmwareServiceImpl extends ServiceImpl i } } + @Transactional(rollbackFor = Exception.class) + @Override + public boolean removeData(Long id) { + Firmware firmware = getById(id); + if(firmware != null ){ + if(firmware.getDownloadUrl() != null) { + OSSUploadUtil.deleteFile(getUrlLastSegment(firmware.getDownloadUrl())); + } + return removeById(id); + } + return false; + } + + /** + * 获取 URL 路径的最后一节(忽略查询参数 ? 和锚点 #) + * @param urlStr URL字符串 + * @return 最后一节(如文件名、资源ID),异常/无路径时返回空字符串 + */ + public static String getUrlLastSegment(String urlStr) { + // 1. 空值判断 + if (urlStr == null || urlStr.trim().isEmpty()) { + return ""; + } + + // 2. 移除查询参数(? 及后面的内容) + int queryIndex = urlStr.indexOf('?'); + if (queryIndex != -1) { + urlStr = urlStr.substring(0, queryIndex); + } + + // 3. 移除锚点(# 及后面的内容) + int anchorIndex = urlStr.indexOf('#'); + if (anchorIndex != -1) { + urlStr = urlStr.substring(0, anchorIndex); + } + + // 4. 找到最后一个 "/" 的位置 + int lastSlashIndex = urlStr.lastIndexOf('/'); + + // 5. 处理特殊情况:无 "/" 或 "/" 在末尾 + if (lastSlashIndex == -1) { + // 无路径(如 "https://example.com" 或 "example.com") + return ""; + } + if (lastSlashIndex == urlStr.length() - 1) { + // 路径以 "/" 结尾(如 "https://example.com/folder/"),需找倒数第二个 "/" + urlStr = urlStr.substring(0, lastSlashIndex); + lastSlashIndex = urlStr.lastIndexOf('/'); + // 若倒数第二个 "/" 不存在(如 "https://example.com/"),返回空 + if (lastSlashIndex == -1) { + return ""; + } + } + + // 6. 截取最后一个 "/" 后面的内容 + return urlStr.substring(lastSlashIndex + 1); + } } diff --git a/src/main/java/com/corewing/app/util/OSSUploadUtil.java b/src/main/java/com/corewing/app/util/OSSUploadUtil.java index 78665ee..f93981d 100644 --- a/src/main/java/com/corewing/app/util/OSSUploadUtil.java +++ b/src/main/java/com/corewing/app/util/OSSUploadUtil.java @@ -47,7 +47,11 @@ public class OSSUploadUtil { // 上传文件 PutObjectRequest request = new PutObjectRequest(BUCKET_NAME, objectName, inputStream, metadata); PutObjectResult result = ossClient.putObject(request); - + ossClient.setObjectAcl( + BUCKET_NAME, // Bucket 名称 + objectName, // 刚上传的文件路径 + CannedAccessControlList.PublicRead // 公共可读权限 + ); // 生成文件访问 URL(公网访问需 Bucket 设为公共读) return String.format("https://%s.%s/%s", BUCKET_NAME, ENDPOINT, objectName); } finally { @@ -69,6 +73,11 @@ public class OSSUploadUtil { try { File file = new File(localFilePath); ossClient.putObject(BUCKET_NAME, objectName, file); + ossClient.setObjectAcl( + BUCKET_NAME, // Bucket 名称 + objectName, // 刚上传的文件路径 + CannedAccessControlList.PublicRead // 公共可读权限 + ); return String.format("https://%s.%s/%s", BUCKET_NAME, ENDPOINT, objectName); } finally { if (ossClient != null) { diff --git a/src/main/resources/templates/admin/biz/firmware/index.html b/src/main/resources/templates/admin/biz/firmware/index.html index ca3b132..0fd35ba 100644 --- a/src/main/resources/templates/admin/biz/firmware/index.html +++ b/src/main/resources/templates/admin/biz/firmware/index.html @@ -269,7 +269,7 @@ -
+