|
@@ -1,24 +1,33 @@
|
|
|
package cn.com.qmth.examcloud.core.oe.student.api.controller.client;
|
|
|
|
|
|
import cn.com.qmth.examcloud.api.commons.security.bean.User;
|
|
|
+import cn.com.qmth.examcloud.commons.exception.StatusException;
|
|
|
+import cn.com.qmth.examcloud.commons.util.FileUtil;
|
|
|
import cn.com.qmth.examcloud.commons.util.JsonMapper;
|
|
|
+import cn.com.qmth.examcloud.core.oe.student.base.utils.Check;
|
|
|
import cn.com.qmth.examcloud.core.oe.student.bean.*;
|
|
|
import cn.com.qmth.examcloud.core.oe.student.service.*;
|
|
|
import cn.com.qmth.examcloud.support.Constants;
|
|
|
import cn.com.qmth.examcloud.support.examing.ExamQuestion;
|
|
|
import cn.com.qmth.examcloud.support.examing.ExamRecordPaperStruct;
|
|
|
import cn.com.qmth.examcloud.support.examing.ExamingSession;
|
|
|
+import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
|
|
|
+import cn.com.qmth.examcloud.support.filestorage.UploadResult;
|
|
|
import cn.com.qmth.examcloud.support.handler.richtext2.RichTextConverter;
|
|
|
+import cn.com.qmth.examcloud.web.filestorage.FileStoragePathEnvInfo;
|
|
|
+import cn.com.qmth.examcloud.web.filestorage.YunPathInfo;
|
|
|
import cn.com.qmth.examcloud.web.redis.RedisClient;
|
|
|
import cn.com.qmth.examcloud.web.support.ControllerSupport;
|
|
|
import io.swagger.annotations.Api;
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
|
import io.swagger.annotations.ApiParam;
|
|
|
+import org.apache.commons.codec.digest.DigestUtils;
|
|
|
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.*;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.util.List;
|
|
@@ -130,13 +139,6 @@ public class ExamProcessController extends ControllerSupport {
|
|
|
examRecordQuestionsService.submitQuestionAnswer(user.getUserId(), examQuestionInfos, referer, agent);
|
|
|
}
|
|
|
|
|
|
- @ApiOperation(value = "保存活体检测结果")
|
|
|
- @PostMapping("/saveFaceBiopsyResult")
|
|
|
- public SaveFaceBiopsyResultResp saveFaceBiopsyResult(@RequestBody SaveFaceBiopsyResultReq req) {
|
|
|
- // todo
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
@ApiOperation(value = "获取课程名称")
|
|
|
@PostMapping("/courseName/{id}")
|
|
|
public String courseName(@PathVariable Long id) {
|
|
@@ -161,4 +163,39 @@ public class ExamProcessController extends ControllerSupport {
|
|
|
redisClient.set(cacheKey, reason, 3 * 60 * 60);
|
|
|
}
|
|
|
|
|
|
+ @ApiOperation(value = "文件上传")
|
|
|
+ @PostMapping("/upload")
|
|
|
+ public UploadResult upload(@RequestParam(required = false) String md5,
|
|
|
+ @RequestPart(value = "file", required = false) MultipartFile file) throws Exception {
|
|
|
+ Check.isBlank(md5, "文件MD5不能为空");
|
|
|
+ Check.isNull(file, "文件不能为空");
|
|
|
+
|
|
|
+ String realMD5 = DigestUtils.md5Hex(file.getInputStream());
|
|
|
+ if (!realMD5.equals(md5)) {
|
|
|
+ log.warn("realMD5 = {}, md5 = {}", realMD5, md5);
|
|
|
+ throw new StatusException("400403", "文件MD5验证失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ User user = getAccessUser();
|
|
|
+
|
|
|
+ final String fileSuffix = FileUtil.getFileSuffix(file.getOriginalFilename());
|
|
|
+ final String newFileName = FileUtil.generateFileName();
|
|
|
+ //路径规则:oe/rootOrgId/yyyyMMdd/userId_fileName.fileSuffix
|
|
|
+ final String uploadPath = String.format("oe/%s/%s/%s_%s%s", user.getRootOrgId(), FileUtil.dateDir(), user.getUserId(), newFileName, fileSuffix);
|
|
|
+
|
|
|
+ FileStoragePathEnvInfo env = new FileStoragePathEnvInfo();
|
|
|
+ env.setRootOrgId(String.valueOf(user.getRootOrgId()));
|
|
|
+ env.setRelativePath(uploadPath);
|
|
|
+ YunPathInfo result = FileStorageUtil.saveFile(Constants.OE_SITEID, env, file.getBytes(), false);
|
|
|
+
|
|
|
+ return new UploadResult(file.getOriginalFilename(), result.getRelativePath(), result.getUrl());
|
|
|
+ }
|
|
|
+
|
|
|
+ @ApiOperation(value = "保存活体检测结果", hidden = true)
|
|
|
+ @PostMapping("/saveFaceBiopsyResult")
|
|
|
+ public SaveFaceBiopsyResultResp saveFaceBiopsyResult(@RequestBody SaveFaceBiopsyResultReq req) {
|
|
|
+ // todo
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
}
|