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