Bläddra i källkod

文件归档上传

yin 1 år sedan
förälder
incheckning
1ff6d75d63

+ 5 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/UploadFileEnum.java

@@ -52,11 +52,16 @@ public enum UploadFileEnum {
      * 签到表文件(path:{uploadType}/{examId}/{coursePaperId}/{packageCode}-{packageNo}.jpg)
      */
     PACKAGE("package", "private", "%s/%d/%s/%s-%s.%s"),
+    /**
+     * 归档文件(path:{uploadType}/{examId}/{paperNumber}/{documentType}-{no}.{format})
+     */
+    DOCUMENT("document", "private", "%s/%d/%s/%s-%s.%s"),
     /**
      * 扫描端日志文件(path:{uploadType}/{schoolCode}/{deviceCode}/{fileName})
      */
     LOG("log", "public", "%s/%s/%s/%s");
 
+
     private String title;
     private String fssType;
     private String pattern;

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/FileUploadService.java

@@ -5,11 +5,12 @@ import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 
 import java.io.File;
+import java.io.InputStream;
 
 public interface FileUploadService {
 
     FilePathVo uploadFile(File sourceFile, UploadFileEnum uploadFileEnum, String fileName);
-    FilePathVo uploadFile(File sourceFile, String filePathName, UploadFileEnum uploadFileEnum);
+    FilePathVo uploadFile(InputStream in, String filePathName, UploadFileEnum uploadFileEnum);
     File downloadFile(String path, String pathName) throws Exception;
     File downloadFile(String type, UploadFileEnum uploadFileEnum, String path, String pathName) throws Exception;
     File downloadFile(Long attachmentId, String pathName) throws Exception;

+ 16 - 7
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/FileUploadServiceImpl.java

@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.InputStream;
 import java.time.LocalDateTime;
 import java.util.Objects;
 import java.util.StringJoiner;
@@ -80,14 +81,14 @@ public class FileUploadServiceImpl implements FileUploadService {
     }
 
     /**
-     * 上传文件(指定保存路径)
      *
-     * @param sourceFile     上传文件
-     * @param filePathName   文件名称(路径+文件名)
-     * @param uploadFileEnum 文件类型
+     * @param in
+     * @param filePathName
+     * @param uploadFileEnum
+     * @return
      */
     @Override
-    public FilePathVo uploadFile(File sourceFile, String filePathName, UploadFileEnum uploadFileEnum) {
+    public FilePathVo uploadFile(InputStream in, String filePathName, UploadFileEnum uploadFileEnum) {
         try {
             boolean oss = dictionaryConfig.sysDomain().isOss();
             StringJoiner pdfStringJoiner = new StringJoiner("");
@@ -97,10 +98,10 @@ public class FileUploadServiceImpl implements FileUploadService {
             }
             pdfStringJoiner.add(uploadFileEnum.getTitle()).add(File.separator).add(filePathName);
             String uploadFileName = FileUtil.replaceSplit(pdfStringJoiner.toString());
-            uploadFile(oss, uploadFileEnum, uploadFileName, sourceFile);
+            uploadFile(oss, uploadFileEnum, uploadFileName, in);
 
             String type = isOssUpload(oss, uploadFileEnum) ? SystemConstant.OSS : SystemConstant.LOCAL;
-            return new FilePathVo(uploadFileName, uploadFileEnum, type, FileUtil.md5File(sourceFile));
+            return new FilePathVo(uploadFileName, uploadFileEnum, type, FileUtil.md5File(in));
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ApiException) {
@@ -322,6 +323,14 @@ public class FileUploadServiceImpl implements FileUploadService {
             fileStoreUtil.localUpload(uploadFileName, new FileInputStream(file), DigestUtils.md5Hex(new FileInputStream(file)), LocalCatalogEnum.LOCAL_PDF);
         }
     }
+    public void uploadFile(boolean oss, UploadFileEnum uploadFileEnum, String uploadFileName, InputStream in) throws Exception {
+        FileStoreUtil fileStoreUtil = SpringContextHolder.getBean(FileStoreUtil.class);
+        if (isOssUpload(oss, uploadFileEnum)) {
+            fileStoreUtil.ossUpload(uploadFileName, in, DigestUtils.md5Hex(in), fileStoreUtil.getUploadEnumByPath(uploadFileName).getFssType());
+        } else {
+            fileStoreUtil.localUpload(uploadFileName, in, DigestUtils.md5Hex(in), LocalCatalogEnum.LOCAL_PDF);
+        }
+    }
 
     /**
      * 按日期生成目录

+ 65 - 11
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkDocumentServiceImpl.java

@@ -1,18 +1,26 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.Objects;
 
 import javax.annotation.Resource;
 
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
+import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.mark.entity.MarkDocument;
@@ -32,6 +40,8 @@ import com.qmth.teachcloud.mark.service.MarkPaperService;
  */
 @Service
 public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, MarkDocument> implements MarkDocumentService {
+    @Resource
+    private FileUploadService fileUploadService;
     @Resource
     private FileStoreUtil fileStoreUtil;
     @Resource
@@ -58,13 +68,28 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
                 ||document.getType().equals(DocumentType.PROCESS_SCORE)){
             throw ExceptionResultEnum.ERROR.exception("文档类型不正确");
         }
-        String filePath = fileStoreUtil.uploadFile(file, md5, UploadFileEnum.FILE);
-        UpdateWrapper<MarkDocument> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkDocument::getFilePath, filePath)
-                .set(MarkDocument::getFileCount, 1)
-                .eq(MarkDocument::getId, id);
-        this.update(updateWrapper);
-        return teachcloudCommonService.filePreview(filePath);
+        try {
+            String fileMd5  = DigestUtils.md5Hex(file.getBytes());
+            if (!Objects.equals(fileMd5, md5)) {
+                throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
+            }
+            String format = FilenameUtils.getExtension(file.getOriginalFilename());
+            String name = document.getType().getName();
+            if(document.getType().equals(DocumentType.CUSTOM)){
+                name = document.getName();
+            }
+            String filePath = getDocumentUri(document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),name,format);
+            FilePathVo vo = fileUploadService.uploadFile(file.getInputStream(),filePath ,UploadFileEnum.DOCUMENT);
+            UpdateWrapper<MarkDocument> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(MarkDocument::getFilePath, vo.getPath())
+                    .set(MarkDocument::getFileCount, 1)
+                    .eq(MarkDocument::getId, id);
+            this.update(updateWrapper);
+            return teachcloudCommonService.filePreview(vo.getPath());
+        } catch (IOException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw new ParameterException("原图上传失败", e);
+        }
     }
 
     @Override
@@ -85,15 +110,44 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
         if(markPaper==null ||markPaper.getStatus().equals(MarkPaperStatus.FINISH)){
             throw ExceptionResultEnum.ERROR.exception("评卷未结束或试卷不存在");
         }
-        MarkDocument document = new MarkDocument();
+        QueryWrapper<MarkDocument> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkDocument::getExamId, examId)
+                .eq(MarkDocument::getPaperNumber, paperNumber)
+                .eq(MarkDocument::getName, documentName);
+        MarkDocument document = this.getOne(queryWrapper);
+        if(document!=null){
+            throw ExceptionResultEnum.ERROR.exception(document+"已存在");
+        }
+        document = new MarkDocument();
         document.setExamId(examId);
         document.setPaperNumber(paperNumber);
         document.setCourseCode(markPaper.getCourseCode());
         document.setCourseName(markPaper.getCourseName());
         document.setType(DocumentType.CUSTOM);
+        document.setName(documentName);
         document.setFileCount(1);
-        String filePath = fileStoreUtil.uploadFile(file, md5, UploadFileEnum.FILE);
-        document.setFilePath(filePath);
-        return teachcloudCommonService.filePreview(filePath);
+        try {
+            String fileMd5  = DigestUtils.md5Hex(file.getBytes());
+            if (!Objects.equals(fileMd5, md5)) {
+                throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
+            }
+            String format = FilenameUtils.getExtension(file.getOriginalFilename());
+            String name = document.getType().getName();
+            if(document.getType().equals(DocumentType.CUSTOM)){
+                name = document.getName();
+            }
+            String filePath = getDocumentUri(document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),name,format);
+            FilePathVo vo = fileUploadService.uploadFile(file.getInputStream(),filePath ,UploadFileEnum.DOCUMENT);
+            document.setFilePath(vo.getPath());
+            this.save(document);
+            return teachcloudCommonService.filePreview(vo.getPath());
+        } catch (IOException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            throw new ParameterException("文件上传失败", e);
+        }
+    }
+
+    public String getDocumentUri(Long examId, String paperNumber, String documentType, String no,String format) {
+        return UploadFileEnum.DOCUMENT.getPath(UploadFileEnum.DOCUMENT.getTitle(), examId, paperNumber, documentType, no, format.toLowerCase());
     }
 }