From 83c656f572f1ca99b253537c8cfdeeb5087f01ff Mon Sep 17 00:00:00 2001 From: 邓实川 <544939826@qq.com> Date: Mon, 11 May 2020 15:41:28 +0800 Subject: [PATCH] oss删除文件接口 --- src/main/java/cn/timer/api/controller/oss/OSSController.java | 38 ++++++++++++++++++++++++++++++++++++++ src/main/java/cn/timer/api/controller/qyxx/CmsController.java | 20 ++++++++++++++------ src/main/java/cn/timer/api/dto/oss/OssDto.java | 41 +++++++++++++++++++++++++++++++++++++++++ src/main/java/cn/timer/api/utils/aliyun/OSSUtil.java | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 207 insertions(+), 13 deletions(-) create mode 100644 src/main/java/cn/timer/api/dto/oss/OssDto.java diff --git a/src/main/java/cn/timer/api/controller/oss/OSSController.java b/src/main/java/cn/timer/api/controller/oss/OSSController.java index caa7239..1a02839 100644 --- a/src/main/java/cn/timer/api/controller/oss/OSSController.java +++ b/src/main/java/cn/timer/api/controller/oss/OSSController.java @@ -7,7 +7,9 @@ import java.util.List; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -15,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile; import cn.timer.api.config.annotation.CurrentUser; import cn.timer.api.config.annotation.UserBean; +import cn.timer.api.dto.oss.OssDto; import cn.timer.api.utils.Result; import cn.timer.api.utils.ResultUtil; import cn.timer.api.utils.aliyun.OSSUtil; @@ -113,4 +116,39 @@ public class OSSController { return ResultUtil.data(url, "获取成功"); } + /*********** + * DELETE + * + * @param moudle + ************/ + + @DeleteMapping(value = "/delSingle") + @ApiOperation(value = "删除单个(谨慎使用)", httpMethod = "DELETE", notes = "接口发布说明") + public Result<String> delSingle(@CurrentUser UserBean userBean, @RequestParam(required = false) String moudle, + @RequestParam(required = false) String fileName) { + String path = "8timer2.0/" + userBean.getOrgCode() + "/" + moudle + "/" + fileName; + oss.delSingleFile(path); + return ResultUtil.success("删除成功"); + } + + @DeleteMapping(value = "/delFiles") + @ApiOperation(value = "删除多个(谨慎使用,谨慎使用)", httpMethod = "DELETE", notes = "接口发布说明") + public Result<List<String>> delFiles(@CurrentUser UserBean userBean, @RequestBody OssDto ossDto) { + List<String> keys = null; + for (String fileName : ossDto.getFileNames()) { + keys = new ArrayList<String>(); + String key = "8timer2.0/" + userBean.getOrgCode() + "/" + ossDto.getMoudle() + "/" + fileName; + keys.add(key); + } + List<String> list = oss.delFiles(keys, ossDto.isQuiet()); + return ResultUtil.data(list, "删除成功"); + } + +// @DeleteMapping(value = "/delWithPrefix") +// @ApiOperation(value = "删除指定前缀文件(谨慎使用,谨慎使用,谨慎使用)", httpMethod = "DELETE", notes = "接口发布说明") +// public Result<String> delWithPrefix(@RequestParam String prefix) { +// oss.delPrefixWith(prefix); +// return ResultUtil.success("删除成功"); +// } + } diff --git a/src/main/java/cn/timer/api/controller/qyxx/CmsController.java b/src/main/java/cn/timer/api/controller/qyxx/CmsController.java index 5647229..548a7e2 100644 --- a/src/main/java/cn/timer/api/controller/qyxx/CmsController.java +++ b/src/main/java/cn/timer/api/controller/qyxx/CmsController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -171,18 +172,21 @@ public class CmsController { @ApiOperation(value = "添加/修改企业OA讯息", httpMethod = "POST", notes = "接口发布说明") public Result<CmsContent> updateqyxx(@CurrentUser UserBean userBean, @RequestBody CmsContentDto cmsContentDto) { + Integer orgCode = userBean.getOrgCode(); + Integer empNum = userBean.getEmpNum(); + String str = StringUtils.join(cmsContentDto.getFilepath(), ","); // 数组转字符串(逗号分隔)(推荐) CmsContent qynr = new CmsContent(); BeanUtil.copyProperties(cmsContentDto, qynr); qynr.setFilepath(str); - Integer i = 10000; - qynr.setXxbh("XX" + i++); +// Integer i = 10000; +// qynr.setXxbh("XX" + i++); Boolean a = qynr.getId() == null; if (a && qynr.getPublisher() == null) - qynr.setPublisher(userBean.getEmpNum()); - qynr.setOrganizationId(userBean.getOrgCode()); + qynr.setPublisher(empNum); + qynr.setOrganizationId(orgCode); Long now = new Date().getTime(); // 录入时间 qynr.setAddeddate(now); @@ -194,6 +198,8 @@ public class CmsController { qynr.setReleasetime(qynr.getReleasetime()); } + qynr.setPublisherName(YgglMainEmp.builder().build().selectOne(new LambdaQueryWrapper<YgglMainEmp>() + .eq(YgglMainEmp::getOrgCode, orgCode).eq(YgglMainEmp::getEmpNum, empNum)).getName()); qynr.setReleasetype(fbfs); qynr.setStatus(0); qynr.insertOrUpdate(); @@ -225,9 +231,11 @@ public class CmsController { @ApiOperation(value = "审核企业OA讯息", httpMethod = "POST", notes = "接口发布说明") public Result<CmsContent> shqyxx(@CurrentUser UserBean userBean, @RequestBody CmsContent qynr) { Long now = new Date().getTime(); + Integer orgCode = userBean.getOrgCode(); + Integer empNum = userBean.getEmpNum(); - YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build() - .selectOne(new QueryWrapper<YgglMainEmp>().eq("emp_num", userBean.getEmpNum())); + YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda() + .eq(YgglMainEmp::getOrgCode, orgCode).eq(YgglMainEmp::getEmpNum, empNum)); if (ygglMainEmp != null) { qynr.setAuditor(ygglMainEmp.getName());// 审核人 } diff --git a/src/main/java/cn/timer/api/dto/oss/OssDto.java b/src/main/java/cn/timer/api/dto/oss/OssDto.java new file mode 100644 index 0000000..6be78cc --- /dev/null +++ b/src/main/java/cn/timer/api/dto/oss/OssDto.java @@ -0,0 +1,41 @@ +/** +* <p>Title: OssDto.java</p> +* <p>Description: </p> +* @author dsc +* @date 2020年5月11日 +* @version 1.0 +*/ +package cn.timer.api.dto.oss; + +import java.io.Serializable; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * <p> + * Title: OssDto.java + * </p> + * <p> + * Description: + * </p> + * + * @author dsc + * @date 2020年5月11日 + * @version 1.0 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OssDto implements Serializable { + + private static final long serialVersionUID = 6897868588272725L; + private String moudle; + private List<String> fileNames; + private boolean quiet; +} diff --git a/src/main/java/cn/timer/api/utils/aliyun/OSSUtil.java b/src/main/java/cn/timer/api/utils/aliyun/OSSUtil.java index 651d519..5c08236 100644 --- a/src/main/java/cn/timer/api/utils/aliyun/OSSUtil.java +++ b/src/main/java/cn/timer/api/utils/aliyun/OSSUtil.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; +import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -18,8 +19,13 @@ import org.springframework.web.multipart.commons.CommonsMultipartResolver; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.DeleteObjectsRequest; +import com.aliyun.oss.model.DeleteObjectsResult; import com.aliyun.oss.model.GetObjectRequest; +import com.aliyun.oss.model.ListObjectsRequest; import com.aliyun.oss.model.OSSObject; +import com.aliyun.oss.model.OSSObjectSummary; +import com.aliyun.oss.model.ObjectListing; import com.aliyun.oss.model.PutObjectRequest; import cn.hutool.core.util.StrUtil; @@ -40,22 +46,22 @@ public class OSSUtil { @Value("${config-8timer.Aliyun.ACCESSKEY_ID}") private String accessKeyId; - + @Value("${config-8timer.Aliyun.SECRET}") private String accessKeySecret; - + @Value("${config-8timer.Aliyun.bucketName}") private String bucketName; - + @Value("${config-8timer.Aliyun.bucketName_pri}") private String bucketName_pri; - + @Value("${config-8timer.Aliyun.project_package}") private String project_package; - + @Value("${config-8timer.Aliyun.expirationTime}") private String expirationTime; - + @Value("${config-8timer.Aliyun.expirationTime_pri}") private String expirationTime_pri; @@ -70,7 +76,7 @@ public class OSSUtil { // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 // https://ram.console.aliyun.com 创建RAM账号。 // 创建OSSClient实例。 - + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 创建存储空间。 ossClient.createBucket(bucketName); @@ -328,6 +334,107 @@ public class OSSUtil { return url.toString(); } + /** + * 删除单个 + * + * @param objectName 文件名 + */ + public void delSingleFile(String objectName) { +// // Endpoint以杭州为例,其它Region请按实际情况填写。 +// String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; +// // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 +// String accessKeyId = "<yourAccessKeyId>"; +// String accessKeySecret = "<yourAccessKeySecret>"; +// String bucketName = "<yourBucketName>"; +// String objectName = "<yourObjectName>"; + + // 创建OSSClient实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + + // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。 + ossClient.deleteObject(bucketName, objectName); + + // 关闭OSSClient。 + ossClient.shutdown(); + } + + /** + * 删除多个文件 + * @param keys 需要删除的文件。 + * @param quiet 返回模式。true表示简单模式,false表示详细模式。默认为详细模式。 + * @return 删除结果。详细模式下为删除成功的文件列表,简单模式下为删除失败的文件列表。 + */ + public List<String> delFiles(List<String> keys, boolean quiet) { +// // Endpoint以杭州为例,其它Region请按实际情况填写。 +// String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; +// // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 +// String accessKeyId = "<yourAccessKeyId>"; +// String accessKeySecret = "<yourAccessKeySecret>"; +// String bucketName = "<yourBucketName>"; + + // 创建OSSClient实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + + // 删除文件。key等同于ObjectName,表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 +// List<String> keys = new ArrayList<String>(); +// keys.add("key0"); +// keys.add("key1"); +// keys.add("key2"); + + DeleteObjectsResult deleteObjectsResult = ossClient + .deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys).withQuiet(quiet)); + List<String> deletedObjects = deleteObjectsResult.getDeletedObjects(); + + // 关闭OSSClient。 + ossClient.shutdown(); + + return deletedObjects; + } + + /** + * 删除指定前缀(prefix)的文件 + * @param prefix + */ + public void delPrefixWith(String prefix) { +// // Endpoint以杭州为例,其它Region请按实际情况填写。 +// String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; +// // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 +// // https://ram.console.aliyun.com 创建RAM账号。 +// String accessKeyId = "<yourAccessKeyId>"; +// String accessKeySecret = "<yourAccessKeySecret>"; +// String bucketName = "<yourBucketName>"; +// +// // 指定前缀。 +// final String prefix = "<yourkeyPrefix>"; + + // 创建OSSClient实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + + // 列举所有包含指定前缀的文件并删除。 + String nextMarker = null; + ObjectListing objectListing = null; + do { + ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName).withPrefix(prefix) + .withMarker(nextMarker); + + objectListing = ossClient.listObjects(listObjectsRequest); + if (objectListing.getObjectSummaries().size() > 0) { + List<String> keys = new ArrayList<String>(); + for (OSSObjectSummary s : objectListing.getObjectSummaries()) { + System.out.println("key name: " + s.getKey()); + keys.add(s.getKey()); + } + DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName).withKeys(keys); + ossClient.deleteObjects(deleteObjectsRequest); + } + + nextMarker = objectListing.getNextMarker(); + } while (objectListing.isTruncated()); + + // 关闭OSSClient。 + ossClient.shutdown(); + } + /* * (跨域资源) // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = * "http://oss-cn-hangzhou.aliyuncs.com"; // -- libgit2 0.26.0