فهرست منبع

添加上传文件相关接口

Diors.Po 6 سال پیش
والد
کامیت
edd96022a9

+ 5 - 0
site/pom.xml

@@ -86,6 +86,11 @@
 			<artifactId>fastjson</artifactId>
 			<version>1.2.58</version>
 		</dependency>
+		<dependency>
+			<groupId>com.aliyun.oss</groupId>
+			<artifactId>aliyun-sdk-oss</artifactId>
+			<version>3.5.0</version>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 40 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/OSSConfiguration.java

@@ -0,0 +1,40 @@
+package com.mooctest.crowd.site.configuration;
+
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 15:51
+ */
+@Data
+@Configuration
+public class OSSConfiguration {
+
+    @Value("${oss.accessKeyId}")
+    private String accessKeyId;
+
+    @Value(("${oss.accessKeySecret}"))
+    private String accessKeySecret;
+
+    @Value("${oss.endPoint}")
+    private String endPoint;
+
+    @Value("${oss.bucketName}")
+    private String bucketName;
+
+    public String getBaseUrl(){
+        return "http://"+bucketName+"."+endPoint+"/";
+    }
+
+    @Bean
+    public OSS ossClient(){
+        return new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
+    }
+}

+ 16 - 0
site/src/main/java/com/mooctest/crowd/site/constants/UploadType.java

@@ -0,0 +1,16 @@
+package com.mooctest.crowd.site.constants;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 15:34
+ * @说明: 上传文件的类型表示,与OSS中的文件夹相对应
+ */
+public class UploadType {
+    public static final String REQUIREMENT_FILE = "RequirementDoc/";
+    public static final String APK = "Apk/";
+    public static final String REPORT = "Report/";
+    public static final String IMAGE = "Image/";
+    public static final String AUTH_INFO = "AuthInfo/";
+    public static final String OTHERS = "Others/";
+}

+ 12 - 4
site/src/main/java/com/mooctest/crowd/site/controller/TestController.java

@@ -1,9 +1,17 @@
 package com.mooctest.crowd.site.controller;
 
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClient;
 import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.site.configuration.OSSConfiguration;
+import com.mooctest.crowd.site.service.UploadService;
+import com.mooctest.crowd.site.util.FileUtil;
 import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 
 /**
  * @author: Diors.Po
@@ -14,11 +22,11 @@ import org.springframework.web.bind.annotation.*;
 public class TestController {
 
     @Autowired
-    private GenerateFlowCodeUtil codeUtil;
+    private UploadService uploadService;
 
-    @RequestMapping(value = "/test/{prefix}", method = RequestMethod.GET)
-    public Object exceptionTest(@PathVariable("prefix") String prefix){
-        return codeUtil.generateFlowCode(prefix);
+    @RequestMapping(value = "/test", method = RequestMethod.POST)
+    public Object exceptionTest(MultipartFile file) throws IOException {
+        return FileUtil.checkFile(file.getInputStream());
     }
 
 }

+ 52 - 0
site/src/main/java/com/mooctest/crowd/site/controller/UploadController.java

@@ -0,0 +1,52 @@
+package com.mooctest.crowd.site.controller;
+
+import com.mooctest.crowd.site.service.UploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 19:23
+ */
+@RestController
+@RequestMapping("/api/files")
+public class UploadController {
+
+    @Autowired
+    private UploadService uploadService;
+
+    @RequestMapping(value = "/requirementfile/{userId}", method = RequestMethod.POST)
+    public String uploadRequirementDoc(MultipartFile file, @PathVariable("userId") Long userId){
+        return uploadService.uploadRequirment(file, userId);
+    }
+
+    @RequestMapping(value = "/apk/{userId}", method = RequestMethod.POST)
+    public String uploadApk(MultipartFile file, @PathVariable("userId") Long userId){
+        return uploadService.uploadAPK(file, userId);
+    }
+
+    @RequestMapping(value = "/report/{userId}", method = RequestMethod.POST)
+    public String uploadReport(MultipartFile file, @PathVariable("userId") Long userId){
+        return uploadService.uploadReport(file, userId);
+    }
+
+    @RequestMapping(value = "/image/{userId}", method = RequestMethod.POST)
+    public String uploadImage(MultipartFile file, @PathVariable("userId") Long userId){
+        return uploadService.uploadImage(file, userId);
+    }
+
+    @RequestMapping(value = "/authinfo/{userId}", method = RequestMethod.POST)
+    public String uploadAuthInfo(MultipartFile file, @PathVariable("userId") Long userId){
+        return uploadService.uploadAuthInfo(file, userId);
+    }
+
+    @RequestMapping(value = "/generalFile", method = RequestMethod.POST)
+    public String uploadGeneralFile(MultipartFile file){
+        return uploadService.uploadGeneralFile(file);
+    }
+}

+ 24 - 0
site/src/main/java/com/mooctest/crowd/site/service/UploadService.java

@@ -0,0 +1,24 @@
+package com.mooctest.crowd.site.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 15:41
+ */
+public interface UploadService {
+    String uploadImage(MultipartFile file, Long userId);
+
+    String uploadReport(MultipartFile file, Long userId);
+
+    String uploadRequirment(MultipartFile file, Long userId);
+
+    String uploadAPK(MultipartFile file, Long userId);
+
+    String uploadAuthInfo(MultipartFile file, Long userId);
+
+    String uploadGeneralFile(MultipartFile file);
+}

+ 95 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/OSSUploadServiceImpl.java

@@ -0,0 +1,95 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.PutObjectResult;
+import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.site.configuration.OSSConfiguration;
+import com.mooctest.crowd.site.constants.UploadType;
+import com.mooctest.crowd.site.service.UploadService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 15:42
+ */
+@Slf4j
+@Service
+public class OSSUploadServiceImpl implements UploadService {
+
+    @Autowired
+    private OSS ossClient;
+
+    @Autowired
+    private OSSConfiguration ossConfig;
+
+    @Override
+    public String uploadImage(MultipartFile file, Long userId) {
+        String fileName = UploadType.IMAGE+file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."))+"_"
+                +userId+"_"
+                +System.currentTimeMillis()+""
+                +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+        return doUpload(fileName, file);
+    }
+
+    @Override
+    public String uploadReport(MultipartFile file, Long userId) {
+        String fileName = UploadType.REPORT+file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."))+"_"
+                +userId+"_"
+                +System.currentTimeMillis()+""
+                +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+        return doUpload(fileName, file);
+    }
+
+    @Override
+    public String uploadRequirment(MultipartFile file, Long userId) {
+        String fileName = UploadType.REQUIREMENT_FILE+file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."))+"_"
+                +userId+"_"
+                +System.currentTimeMillis()+""
+                +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+        return doUpload(fileName, file);    }
+
+    @Override
+    public String uploadAPK(MultipartFile file, Long userId) {
+        String fileName = UploadType.APK+file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."))+"_"
+                +userId+"_"
+                +System.currentTimeMillis()+""
+                +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+        return doUpload(fileName, file);
+    }
+
+    @Override
+    public String uploadAuthInfo(MultipartFile file, Long userId) {
+        String fileName = UploadType.AUTH_INFO+userId+"/"+file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."))+"_"
+                +userId+"_"
+                +System.currentTimeMillis()+""
+                +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+        return doUpload(fileName, file);
+    }
+
+    @Override
+    public String uploadGeneralFile(MultipartFile file){
+        String fileName = UploadType.OTHERS+file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."))+"_"
+                +System.currentTimeMillis()+""
+                +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
+        return doUpload(fileName, file);
+    }
+
+    private String doUpload(String fileName, MultipartFile file){
+        try {
+            PutObjectResult result = ossClient.putObject(ossConfig.getBucketName(), fileName, file.getInputStream());
+            return ossConfig.getBaseUrl()+fileName;
+        } catch (IOException e) {
+            log.error("OSS上传出错!", e);
+            throw new BaseException(e.getMessage());
+        } finally {
+            ossClient.shutdown();
+        }
+    }
+}

+ 84 - 0
site/src/main/java/com/mooctest/crowd/site/util/FileUtil.java

@@ -0,0 +1,84 @@
+package com.mooctest.crowd.site.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-05 19:57
+ */
+@Slf4j
+public class FileUtil {
+    public static final Map<String, String> FILE_TYPE_MAP = new HashMap<>(); //本系统中合法的文件类型
+
+    static {
+
+        //图片
+        FILE_TYPE_MAP.put("ffd8ff", "jpg"); //JPEG (jpg)
+        FILE_TYPE_MAP.put("89504e", "png"); //PNG (png)
+        FILE_TYPE_MAP.put("474946", "gif"); //GIF (gif)
+
+        FILE_TYPE_MAP.put("49492a", "tif"); //TIFF (tif)
+        FILE_TYPE_MAP.put("492049", "tif");
+        FILE_TYPE_MAP.put("4d4d00", "tif");
+
+        FILE_TYPE_MAP.put("424d22", "bmp"); //16色位图(bmp)
+        FILE_TYPE_MAP.put("424d82", "bmp"); //24位位图(bmp)
+        FILE_TYPE_MAP.put("424d8e", "bmp"); //256色位图(bmp)
+
+        //压缩文件
+        FILE_TYPE_MAP.put("504b03", "zip");
+        FILE_TYPE_MAP.put("504b05", "zip");
+        FILE_TYPE_MAP.put("504b07", "zip");
+        FILE_TYPE_MAP.put("526172", "rar");
+
+        //文档
+        FILE_TYPE_MAP.put("255044", "pdf"); //Adobe Acrobat (pdf)
+        FILE_TYPE_MAP.put("504b03", "docx");//docx文件,xlsx等一致
+        FILE_TYPE_MAP.put("d0cf11", "doc/dot"); //MS Excel 注意:word、msi 和 excel的文件头一样
+        FILE_TYPE_MAP.put("0d444f", "doc/dot");
+        FILE_TYPE_MAP.put("cf11e0", "doc/dot");
+        FILE_TYPE_MAP.put("dba52d", "doc/dot");
+        FILE_TYPE_MAP.put("d0cf11", "wps/wks");//WPS文字wps、表格et、演示dps都是一样的
+        FILE_TYPE_MAP.put("0e574b", "wps/wks");
+        FILE_TYPE_MAP.put("ff0002", "wps/wks");
+
+
+    }
+    public static boolean checkFile(InputStream inputStream){
+        try {
+            byte[] headBytes = new byte[3];
+            inputStream.read(headBytes, 0, headBytes.length);
+            String headStr = bytesToHexString(headBytes).toLowerCase();
+            log.info("The Head of File: "+headStr);
+            return FILE_TYPE_MAP.containsKey(headStr);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return true;
+    }
+
+    private static String bytesToHexString(byte[] src) {
+        StringBuilder builder = new StringBuilder();
+        if (src == null || src.length <= 0) {
+            return null;
+        }
+        String hv;
+        for (int i = 0; i < src.length; i++) {
+            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
+            hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
+            if (hv.length() < 2) {
+                builder.append(0);
+            }
+            builder.append(hv);
+        }
+        System.out.println("HexString: " + builder.toString());
+        return builder.toString();
+    }
+}

+ 11 - 1
site/src/main/resources/application.yml

@@ -32,7 +32,17 @@ spring:
         max-wait: -1
         min-idle: 0
     database: 3
+  servlet:
+    multipart:
+      enabled: true
+      max-file-size: 100MB
+      max-request-size: 100MB
 
 feature-switch:
   default:
-    role: generalUser
+    role: generalUser
+oss:
+  accessKeyId: IvS323TIcWUT57MG
+  accessKeySecret: dYml7rvT8stQkoSjMYlfRTxNj9dEsI
+  endPoint: oss-cn-hangzhou.aliyuncs.com
+  bucketName: mooctest-crowd-service