Browse Source

财务导出

zouxuan 3 years ago
parent
commit
0b9c391df2

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.service;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
@@ -127,4 +129,13 @@ public class UploadFileService {
 		return file;
 	}
 
+	/**
+	 * 获取上传文件签名
+	 *
+	 * @param uploadSign
+	 * @return
+	 */
+	public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+		return storagePluginContext.getUploadSign(KS3StoragePlugin.PLUGIN_NAME, uploadSign);
+	}
 }

+ 24 - 3
mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java

@@ -1,8 +1,8 @@
 package com.ym.mec.student.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
+import io.swagger.annotations.*;
 
 import java.util.Date;
 import java.util.HashMap;
@@ -117,6 +117,27 @@ public class StudentManageController extends BaseController {
         return failed("上传失败");
     }
 
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "bucketName", dataType = "String", value = "为空时默认使用daya"),
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+    })
+    @ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+            "    \"bucketName\":\"\",\n" +
+            "    \"filename\":\"test.png\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
+
     @ApiOperation(value = "新增建议")
     @PostMapping("suggestion/add")
     public Object add(SysSuggestion sysSuggestion) {

+ 26 - 7
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherManageController.java

@@ -1,18 +1,16 @@
 package com.ym.mec.teacher.controller;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
 import com.ym.mec.biz.dal.enums.SuggestionType;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.thirdparty.entity.UploadSign;
+import io.swagger.annotations.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
@@ -73,6 +71,27 @@ public class TeacherManageController extends BaseController {
         return failed("上传失败");
     }
 
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "bucketName", dataType = "String", value = "为空时默认使用daya"),
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+    })
+    @ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+            "    \"bucketName\":\"\",\n" +
+            "    \"filename\":\"test.png\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
+
     @ApiOperation(value = "新增建议")
     @PostMapping("suggestion/add")
     public Object add(SysSuggestion sysSuggestion) {

+ 52 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/entity/UploadSign.java

@@ -0,0 +1,52 @@
+package com.ym.mec.thirdparty.entity;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/27
+ */
+public class UploadSign implements Serializable {
+    private String bucketName;
+
+    private String filename;
+
+    private Map<String, String> postData;
+
+    private List<String> unknowValueField;
+
+    public String getBucketName() {
+        return bucketName;
+    }
+
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    public String getFilename() {
+        return filename;
+    }
+
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+
+    public Map<String, String> getPostData() {
+        return postData;
+    }
+
+    public void setPostData(Map<String, String> postData) {
+        this.postData = postData;
+    }
+
+    public List<String> getUnknowValueField() {
+        return unknowValueField;
+    }
+
+    public void setUnknowValueField(List<String> unknowValueField) {
+        this.unknowValueField = unknowValueField;
+    }
+}
+

+ 11 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/storage/StoragePlugin.java

@@ -1,5 +1,8 @@
 package com.ym.mec.thirdparty.storage;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
+
 import java.io.File;
 import java.io.IOException;
 
@@ -32,4 +35,12 @@ public interface StoragePlugin {
 	 * @throws IOException
 	 */
 	byte[] getFile(String folderName, String fileName) throws IOException;
+
+	/**
+	 * 获取上传文件签名
+	 *
+	 * @param uploadSign
+	 * @return
+	 */
+	PostObjectFormFields getUploadSign(UploadSign uploadSign);
 }

+ 7 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/storage/StoragePluginContext.java

@@ -4,6 +4,8 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
 import org.springframework.stereotype.Component;
 
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
@@ -30,6 +32,11 @@ public class StoragePluginContext {
 		return StoragePlugin.asyncUploadFile(folderName, file, delLocalFile);
 	}
 
+	public PostObjectFormFields getUploadSign(String storagePluginName, UploadSign uploadSign) {
+		StoragePlugin StoragePlugin = getStoragePlugin(storagePluginName);
+		return StoragePlugin.getUploadSign(uploadSign);
+	}
+
 	private StoragePlugin getStoragePlugin(String storagePluginName) {
 		StoragePlugin storagePlugin = mapper.get(storagePluginName);
 

+ 49 - 1
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/storage/provider/AliyunOssStoragePlugin.java

@@ -2,9 +2,17 @@ package com.ym.mec.thirdparty.storage.provider;
 
 import java.io.File;
 import java.io.IOException;
-
+import java.util.List;
+import java.util.Map;
+
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ksyun.ks3.service.Ks3;
+import com.ksyun.ks3.service.Ks3Client;
+import com.ksyun.ks3.service.Ks3ClientConfig;
+import com.ym.mec.thirdparty.entity.UploadSign;
 import com.ym.mec.thirdparty.threadLocal.BucketContextHolder;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -121,6 +129,46 @@ public class AliyunOssStoragePlugin implements StoragePlugin, InitializingBean,
 	}
 
 	@Override
+	public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+		//要上传的文件名称,不包含路径信息
+		String fileName = uploadSign.getFilename();
+		//可以确定值得表单项
+		Map<String, String> postData = uploadSign.getPostData();
+		//无法确定值得表单项
+		List<String> unknowValueField = uploadSign.getUnknowValueField();
+
+		Ks3ClientConfig config = new Ks3ClientConfig();
+		// 设置域名
+		config.setEndpoint(endpoint);
+		// 创建Ks3Client实例
+		Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+		/**
+		 * 需要用户在postData和unknowValueField中提供所有的除KSSAccessKeyId, signature, file, policy外的所有表单项。否则用生成的签名上传会返回403</br>
+		 * 对于用户可以确定表单值的放在 postData中,对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)</br>
+		 */
+		//Map<String, String> postData = new HashMap<String, String>();
+		// 如果使用js sdk上传的时候设置了ACL,请提供以下一行,且值要与SDK中一致,否则删除下面一行代码
+		//postData.put("acl","public-read");
+		// 提供js sdk中的key值
+		//postData.put("key","20150115/中文/${filename}");
+		// 设置无法确定的表单值
+		//List<String> unknowValueField = new ArrayList<String>();
+
+		// js sdk上传的时候会自动加上一个name的表单项,所以下面需要加上这样的代码。
+		unknowValueField.add("name");
+
+		// 如果计算签名时提供的key里不包含${filename}占位符,第二个参数传一个空字符串。
+		String postDataKey = postData.get("key");
+		if (StringUtils.isNotBlank(postDataKey)) {
+			if (postDataKey.indexOf("${filename}") == -1) {
+				return client.postObject(bucketName, "", postData, unknowValueField);
+			}
+		}
+		return client.postObject(bucketName, fileName, postData, unknowValueField);
+	}
+
+	@Override
 	public void destroy() throws Exception {
 		if (ossClient != null) {
 			ossClient.shutdown();

+ 53 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/storage/provider/KS3StoragePlugin.java

@@ -2,8 +2,14 @@ package com.ym.mec.thirdparty.storage.provider;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.util.IOUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -139,6 +145,53 @@ public class KS3StoragePlugin implements StoragePlugin, InitializingBean, Dispos
 	}
 
 	@Override
+	public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+		String bucketName = uploadSign.getBucketName();
+		if (bucketName == null) {
+			bucketName = this.bucketName;
+		}
+		//要上传的文件名称,不包含路径信息
+		String fileName = uploadSign.getFilename();
+		//可以确定值得表单项
+		Map<String, String> postData = uploadSign.getPostData();
+		//无法确定值得表单项
+		List<String> unknowValueField = uploadSign.getUnknowValueField();
+		if (unknowValueField == null) {
+			unknowValueField = new ArrayList<>();
+		}
+
+		Ks3ClientConfig config = new Ks3ClientConfig();
+		// 设置域名
+		config.setEndpoint(endpoint);
+		// 创建Ks3Client实例
+		Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
+
+		/**
+		 * 需要用户在postData和unknowValueField中提供所有的除KSSAccessKeyId, signature, file, policy外的所有表单项。否则用生成的签名上传会返回403</br>
+		 * 对于用户可以确定表单值的放在 postData中,对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)</br>
+		 */
+		//Map<String, String> postData = new HashMap<String, String>();
+		// 如果使用js sdk上传的时候设置了ACL,请提供以下一行,且值要与SDK中一致,否则删除下面一行代码
+		//postData.put("acl","public-read");
+		// 提供js sdk中的key值
+		//postData.put("key","20150115/中文/${filename}");
+		// 设置无法确定的表单值
+		//List<String> unknowValueField = new ArrayList<String>();
+
+		// js sdk上传的时候会自动加上一个name的表单项,所以下面需要加上这样的代码。
+		unknowValueField.add("name");
+
+		// 如果计算签名时提供的key里不包含${filename}占位符,第二个参数传一个空字符串。
+		String postDataKey = postData.get("key");
+		if (StringUtils.isNotBlank(postDataKey)) {
+			if (postDataKey.indexOf("${filename}") == -1) {
+				return client.postObject(bucketName, "", postData, unknowValueField);
+			}
+		}
+		return client.postObject(bucketName, fileName, postData, unknowValueField);
+	}
+
+	@Override
 	public void destroy() throws Exception {
 	}
 

+ 26 - 4
mec-web/src/main/java/com/ym/mec/web/controller/UploadFileController.java

@@ -1,13 +1,13 @@
 package com.ym.mec.web.controller;
 
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
 import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.UploadReturnBean;
-import com.ym.mec.thirdparty.threadLocal.BucketEnum;
-import com.ym.mec.thirdparty.threadLocal.BucketContextHolder;
 import com.ym.mec.util.upload.UploadUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.*;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.Base64Utils;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -89,4 +90,25 @@ public class UploadFileController extends BaseController {
 		
 		return failed();
 	}
+
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "bucketName", dataType = "String", value = "为空时默认使用daya"),
+			@ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+			@ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+					"2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+			@ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+	})
+	@ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+			"    \"bucketName\":\"\",\n" +
+			"    \"filename\":\"test.png\",\n" +
+			"    \"postData\":{\n" +
+			"        \"acl\":\"public-read\",\n" +
+			"        \"key\":\"20150115/中文/${filename}\"\n" +
+			"    },\n" +
+			"    \"unknowValueField\":[\"test\"]\n" +
+			"}")
+	@PostMapping("/getUploadSign")
+	public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+		return succeed(uploadFileService.getUploadSign(uploadSign));
+	}
 }