浏览代码

oss图片旋转

wangliang 5 年之前
父节点
当前提交
2e849af97a

+ 86 - 40
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -11,6 +11,7 @@ import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.CommandUtil;
 import cn.com.qmth.stmms.ms.commons.utils.CommandUtil;
+import cn.com.qmth.stmms.ms.commons.utils.FileUtil;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
@@ -32,6 +33,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.FileCopyUtils;
 import org.springframework.util.FileCopyUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import javax.imageio.ImageIO;
@@ -83,11 +85,14 @@ public class CollectApi {
     AliYunOssConfig aliYunOssConfig;
     AliYunOssConfig aliYunOssConfig;
 
 
     @RequestMapping("user/login")
     @RequestMapping("user/login")
-    public LoginDTO login(@RequestParam String loginname, @RequestParam String password) {
+    public LoginDTO login(@RequestParam String loginname, @RequestParam String password) throws Exception {
         LoginDTO loginDTO = null;
         LoginDTO loginDTO = null;
         Work activeWork = null;
         Work activeWork = null;
         if (loginname.equals(loginConfig.uploadLoginConfig().getLoginName()) && password.equals(loginConfig.uploadLoginConfig().getPassword())) {
         if (loginname.equals(loginConfig.uploadLoginConfig().getLoginName()) && password.equals(loginConfig.uploadLoginConfig().getPassword())) {
             activeWork = workRepo.findByActiveTrue();
             activeWork = workRepo.findByActiveTrue();
+            if (Objects.isNull(activeWork)) {
+                throw new Exception("没有work");
+            }
             loginDTO = new LoginDTO();
             loginDTO = new LoginDTO();
             loginDTO.setExamId(activeWork.getId());
             loginDTO.setExamId(activeWork.getId());
             loginDTO.setExamName(activeWork.getName());
             loginDTO.setExamName(activeWork.getName());
@@ -106,6 +111,9 @@ public class CollectApi {
                 throw new RuntimeException("密码错误");
                 throw new RuntimeException("密码错误");
             }
             }
             activeWork = workRepo.findByActiveTrue();
             activeWork = workRepo.findByActiveTrue();
+            if (Objects.isNull(activeWork)) {
+                throw new Exception("没有work");
+            }
             loginDTO = new LoginDTO();
             loginDTO = new LoginDTO();
             loginDTO.setUserId(markUser.getId());
             loginDTO.setUserId(markUser.getId());
             loginDTO.setExamId(activeWork.getId());
             loginDTO.setExamId(activeWork.getId());
@@ -424,22 +432,64 @@ public class CollectApi {
      *
      *
      * @param workId
      * @param workId
      * @param subjectId
      * @param subjectId
-     * @param fileName
+     * @param file
      * @param request
      * @param request
      * @param response
      * @param response
      * @throws Exception
      * @throws Exception
      */
      */
-    @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}/{fileName}", method = {RequestMethod.PUT, RequestMethod.POST})
+    @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}", method = {RequestMethod.PUT, RequestMethod.POST})
     public void upload(@PathVariable Long workId, @PathVariable Integer subjectId,
     public void upload(@PathVariable Long workId, @PathVariable Integer subjectId,
-                       @PathVariable String fileName,
+                       @RequestParam MultipartFile file,
                        HttpServletRequest request, HttpServletResponse response) throws Exception {
                        HttpServletRequest request, HttpServletResponse response) throws Exception {
-        InputStream inputStream = request.getInputStream();
-        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, fileName, String.valueOf(TrialEnum.DEFAULT.getId()));
+        if (Objects.isNull(file)) {
+            throw new Exception("file文件不能为空");
+        }
+        int temp = file.getOriginalFilename().indexOf(".");
+        String examNumber = file.getOriginalFilename().substring(0, temp);
+        String format = file.getOriginalFilename().substring(temp, file.getOriginalFilename().length());
+        if (Objects.nonNull(format) && !(format.equalsIgnoreCase(".jpg") || format.equalsIgnoreCase(".jpeg") || format.equalsIgnoreCase(".png"))) {
+            throw new Exception("file文件格式只能为jpg,jpeg,png");
+        }
+        InputStream inputStream = file.getInputStream();
+        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, examNumber, String.valueOf(TrialEnum.DEFAULT.getId()));
+        if (Objects.isNull(student)) {
+            throw new Exception("准考证号与学生不匹配");
+        }
         Subject subject = Subject.values()[subjectId - 1];
         Subject subject = Subject.values()[subjectId - 1];
-        //保存遮盖图
+
+        //保存原图
+        String saveSheetPath = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
+                + File.separator + student.getAreaCode();
         String savePath = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
         String savePath = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
                 + File.separator + student.getAreaCode();
                 + File.separator + student.getAreaCode();
-        File outFile = saveImage(student, inputStream, savePath);
+        File imageOut = new File(savePath);
+        if (!imageOut.exists()) {
+            imageOut.mkdirs();
+        }
+        File sheetOut = new File(saveSheetPath);
+        if (!sheetOut.exists()) {
+            sheetOut.mkdirs();
+        }
+        File outSheetFile = new File(saveSheetPath + File.separator + student.getExamNumber() + ".jpg");
+        File outImageFile = new File(savePath + File.separator + student.getExamNumber() + ".jpg");
+        OutputStream outputSheetStream = new FileOutputStream(outSheetFile);
+        OutputStream outputImageStream = new FileOutputStream(outImageFile);
+        int index = 0;
+        byte[] bytes = new byte[1024 * 8];
+        while ((index = inputStream.read(bytes)) != -1) {
+            outputSheetStream.write(bytes, 0, index);
+            outputImageStream.write(bytes, 0, index);
+        }
+        inputStream.close();
+        outputSheetStream.flush();
+        outputSheetStream.close();
+        outputImageStream.flush();
+        outputImageStream.close();
+
+        //保存遮盖图
+//        String savePath = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
+//                + File.separator + student.getAreaCode();
+//        File outFile = saveImage(student, inputStream, savePath);
 
 
         // 生成缩略图
         // 生成缩略图
         String thumbDir = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
         String thumbDir = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
@@ -448,12 +498,15 @@ public class CollectApi {
         if (!thumb.exists()) {
         if (!thumb.exists()) {
             thumb.mkdirs();
             thumb.mkdirs();
         }
         }
-        BufferedImage bufferedImage = ImageCompression.compress(outFile, compressionConfig);
+        BufferedImage bufferedImage = ImageCompression.compress(outImageFile, compressionConfig);
         String thumbFileName = thumbDir + File.separator + student.getExamNumber() + ".jpg";
         String thumbFileName = thumbDir + File.separator + student.getExamNumber() + ".jpg";
         ImageIO.write(bufferedImage, "jpg", new File(thumbFileName));
         ImageIO.write(bufferedImage, "jpg", new File(thumbFileName));
 
 
         String md5 = request.getHeader("md5");
         String md5 = request.getHeader("md5");
-        FileInputStream in = new FileInputStream(outFile);
+        if (Objects.isNull(md5)) {
+            throw new Exception("request的md5为空");
+        }
+        FileInputStream in = new FileInputStream(outImageFile);
         String sliceMD5 = DigestUtils.md5Hex(in);
         String sliceMD5 = DigestUtils.md5Hex(in);
         if (!md5.equalsIgnoreCase(sliceMD5)) {
         if (!md5.equalsIgnoreCase(sliceMD5)) {
             throw new Exception("图片md5值不一致");
             throw new Exception("图片md5值不一致");
@@ -478,24 +531,39 @@ public class CollectApi {
      *
      *
      * @param workId
      * @param workId
      * @param subjectId
      * @param subjectId
-     * @param fileName
+     * @param file
      * @param request
      * @param request
      * @param response
      * @param response
      * @throws IOException
      * @throws IOException
      */
      */
     @RequestMapping(value = "file/ms-sheet/{workId}/{subjectId}/{fileName}", method = {RequestMethod.PUT, RequestMethod.POST})
     @RequestMapping(value = "file/ms-sheet/{workId}/{subjectId}/{fileName}", method = {RequestMethod.PUT, RequestMethod.POST})
     public void uploadsheet(@PathVariable Long workId, @PathVariable Integer subjectId,
     public void uploadsheet(@PathVariable Long workId, @PathVariable Integer subjectId,
-                            @PathVariable String fileName,
+                            @RequestParam MultipartFile file,
                             HttpServletRequest request, HttpServletResponse response) throws Exception {
                             HttpServletRequest request, HttpServletResponse response) throws Exception {
-        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, fileName, String.valueOf(TrialEnum.DEFAULT.getId()));
+        if (Objects.isNull(file)) {
+            throw new Exception("file文件不能为空");
+        }
+        int temp = file.getOriginalFilename().indexOf(".");
+        String examNumber = file.getOriginalFilename().substring(0, temp);
+        String format = file.getOriginalFilename().substring(temp, file.getOriginalFilename().length());
+        if (Objects.nonNull(format) && !(format.equalsIgnoreCase(".jpg") || format.equalsIgnoreCase(".jpeg") || format.equalsIgnoreCase(".png"))) {
+            throw new Exception("file文件格式只能为jpg,jpeg,png");
+        }
+        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, examNumber, String.valueOf(TrialEnum.DEFAULT.getId()));
+        if (Objects.isNull(student)) {
+            throw new Exception("准考证号与学生不匹配");
+        }
         Subject subject = Subject.values()[subjectId - 1];
         Subject subject = Subject.values()[subjectId - 1];
-        InputStream inputStream = request.getInputStream();
+        InputStream inputStream = file.getInputStream();
         //保存原图图
         //保存原图图
         String savePath = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
         String savePath = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
                 + File.separator + student.getAreaCode();
                 + File.separator + student.getAreaCode();
         File outFile = saveImage(student, inputStream, savePath);
         File outFile = saveImage(student, inputStream, savePath);
 
 
         String md5 = request.getHeader("md5");
         String md5 = request.getHeader("md5");
+        if (Objects.isNull(md5)) {
+            throw new Exception("request的md5为空");
+        }
         FileInputStream in = new FileInputStream(outFile);
         FileInputStream in = new FileInputStream(outFile);
         String sheetMD5 = DigestUtils.md5Hex(in);
         String sheetMD5 = DigestUtils.md5Hex(in);
         if (!md5.equalsIgnoreCase(sheetMD5)) {
         if (!md5.equalsIgnoreCase(sheetMD5)) {
@@ -531,25 +599,25 @@ public class CollectApi {
             if (Objects.nonNull(imageFile) && imageFile.exists()) {
             if (Objects.nonNull(imageFile) && imageFile.exists()) {
                 String imageResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getImageDir()).add(" ").add(aliYunOssConfig.getImageDir()).toString());
                 String imageResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getImageDir()).add(" ").add(aliYunOssConfig.getImageDir()).toString());
                 LOGGER.info("ossUpload imageResult:{}", imageResult);
                 LOGGER.info("ossUpload imageResult:{}", imageResult);
-                deleteFile(imageFile);
+                FileUtil.deleteFile(imageFile);
             }
             }
             File thumbFile = new File(systemConfig.getThumbDir() + File.separator + workId);
             File thumbFile = new File(systemConfig.getThumbDir() + File.separator + workId);
             if (Objects.nonNull(thumbFile) && thumbFile.exists()) {
             if (Objects.nonNull(thumbFile) && thumbFile.exists()) {
                 String thumbResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getThumbDir()).add(" ").add(aliYunOssConfig.getThumbDir()).toString());
                 String thumbResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getThumbDir()).add(" ").add(aliYunOssConfig.getThumbDir()).toString());
                 LOGGER.info("ossUpload thumbResult:{}", thumbResult);
                 LOGGER.info("ossUpload thumbResult:{}", thumbResult);
-                deleteFile(thumbFile);
+                FileUtil.deleteFile(thumbFile);
             }
             }
             File sheetFile = new File(systemConfig.getSheetDir() + File.separator + workId);
             File sheetFile = new File(systemConfig.getSheetDir() + File.separator + workId);
             if (Objects.nonNull(sheetFile) && sheetFile.exists()) {
             if (Objects.nonNull(sheetFile) && sheetFile.exists()) {
                 String sheetResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getSheetDir()).add(" ").add(aliYunOssConfig.getSheetDir()).toString());
                 String sheetResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getSheetDir()).add(" ").add(aliYunOssConfig.getSheetDir()).toString());
                 LOGGER.info("ossUpload sheetResult:{}", sheetResult);
                 LOGGER.info("ossUpload sheetResult:{}", sheetResult);
-                deleteFile(sheetFile);
+                FileUtil.deleteFile(sheetFile);
             }
             }
             File watermarkFile = new File(systemConfig.getWatermark() + File.separator + workId);
             File watermarkFile = new File(systemConfig.getWatermark() + File.separator + workId);
             if (Objects.nonNull(watermarkFile) && watermarkFile.exists()) {
             if (Objects.nonNull(watermarkFile) && watermarkFile.exists()) {
                 String watermarkResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getWatermark()).add(" ").add(aliYunOssConfig.getWatermark()).toString());
                 String watermarkResult = CommandUtil.run(new StringJoiner("").add(aliYunOssConfig.getUtil()).add(" ").add(systemConfig.getWatermark()).add(" ").add(aliYunOssConfig.getWatermark()).toString());
                 LOGGER.info("ossUpload watermarkResult:{}", watermarkResult);
                 LOGGER.info("ossUpload watermarkResult:{}", watermarkResult);
-                deleteFile(watermarkFile);
+                FileUtil.deleteFile(watermarkFile);
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
@@ -557,26 +625,4 @@ public class CollectApi {
         }
         }
         return true;
         return true;
     }
     }
-
-    /**
-     * 删除文件夹
-     *
-     * @param file
-     */
-    public void deleteFile(File file) throws Exception {
-        //取得这个目录下的所有子文件对象
-        File[] files = file.listFiles();
-        //遍历该目录下的文件对象
-        for (File f : files) {
-            //打印文件名
-            //判断子目录是否存在子目录,如果是文件则删除
-            if (f.isDirectory()) {
-                deleteFile(f);
-            } else {
-                f.delete();
-            }
-        }
-        //删除空文件夹  for循环已经把上一层节点的目录清空。
-        file.delete();
-    }
 }
 }

+ 10 - 1
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/ImageApi.java

@@ -1,8 +1,10 @@
 package cn.com.qmth.stmms.ms.collect.api;
 package cn.com.qmth.stmms.ms.collect.api;
 
 
 import cn.com.qmth.stmms.ms.collect.util.RotateTask;
 import cn.com.qmth.stmms.ms.collect.util.RotateTask;
+import cn.com.qmth.stmms.ms.commons.config.AliYunOssConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.commons.utils.OssUtil;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
@@ -11,6 +13,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import javax.annotation.Resource;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Executors;
@@ -34,6 +37,12 @@ public class ImageApi {
     @Autowired
     @Autowired
     StudentRepo studentRepo;
     StudentRepo studentRepo;
 
 
+    @Resource
+    OssUtil ossUtil;
+
+    @Resource
+    AliYunOssConfig aliYunOssConfig;
+
     private ExecutorService executor = Executors.newFixedThreadPool(10);
     private ExecutorService executor = Executors.newFixedThreadPool(10);
 
 
     private HashSet<String> papers = new HashSet<String>();
     private HashSet<String> papers = new HashSet<String>();
@@ -42,7 +51,7 @@ public class ImageApi {
     public ResponseEntity rotate(@PathVariable Long paperId, @RequestParam int degree) {
     public ResponseEntity rotate(@PathVariable Long paperId, @RequestParam int degree) {
         Paper paper = paperRepo.findOne(paperId);
         Paper paper = paperRepo.findOne(paperId);
         if (!papers.contains(paper.getExamNumber())) {
         if (!papers.contains(paper.getExamNumber())) {
-            executor.submit(new RotateTask(paper, degree, paperRepo, systemConfig, papers, imageConfig, studentRepo));
+            executor.submit(new RotateTask(paper, degree, paperRepo, systemConfig, papers, imageConfig, studentRepo, ossUtil, aliYunOssConfig));
             papers.add(paper.getExamNumber());
             papers.add(paper.getExamNumber());
         }
         }
         return new ResponseEntity(HttpStatus.OK);
         return new ResponseEntity(HttpStatus.OK);

+ 74 - 26
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java

@@ -1,9 +1,11 @@
 package cn.com.qmth.stmms.ms.collect.util;
 package cn.com.qmth.stmms.ms.collect.util;
 
 
+import cn.com.qmth.stmms.ms.commons.config.AliYunOssConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
+import cn.com.qmth.stmms.ms.commons.utils.OssUtil;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Student;
 import cn.com.qmth.stmms.ms.core.domain.Student;
@@ -15,7 +17,7 @@ import org.springframework.util.FileCopyUtils;
 
 
 import java.io.*;
 import java.io.*;
 import java.util.HashSet;
 import java.util.HashSet;
-import java.util.Objects;
+import java.util.StringJoiner;
 
 
 public class RotateTask implements Runnable {
 public class RotateTask implements Runnable {
     private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(RotateTask.class);
     private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(RotateTask.class);
@@ -26,8 +28,10 @@ public class RotateTask implements Runnable {
     private PaperRepo paperRepo;
     private PaperRepo paperRepo;
     private SystemConfig systemConfig;
     private SystemConfig systemConfig;
     private HashSet<String> papers;
     private HashSet<String> papers;
+    private OssUtil ossUtil;
+    private AliYunOssConfig aliYunOssConfig;
 
 
-    public RotateTask(Paper paper, int degree, PaperRepo paperRepo, SystemConfig systemConfig, HashSet<String> papers, ImageConfig imageConfig, StudentRepo studentRepo) {
+    public RotateTask(Paper paper, int degree, PaperRepo paperRepo, SystemConfig systemConfig, HashSet<String> papers, ImageConfig imageConfig, StudentRepo studentRepo, OssUtil ossUtil, AliYunOssConfig aliYunOssConfig) {
         this.paper = paper;
         this.paper = paper;
         this.degree = degree;
         this.degree = degree;
         this.paperRepo = paperRepo;
         this.paperRepo = paperRepo;
@@ -35,6 +39,8 @@ public class RotateTask implements Runnable {
         this.papers = papers;
         this.papers = papers;
         this.imageConfig = imageConfig;
         this.imageConfig = imageConfig;
         this.studentRepo = studentRepo;
         this.studentRepo = studentRepo;
+        this.ossUtil = ossUtil;
+        this.aliYunOssConfig = aliYunOssConfig;
     }
     }
 
 
     @Override
     @Override
@@ -117,32 +123,72 @@ public class RotateTask implements Runnable {
                     e.printStackTrace();
                     e.printStackTrace();
                 }
                 }
             } else {
             } else {
-                thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + ".jpg";
-                thumbNew = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + "_" + start + ".jpg";
-                imagePath = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + ".jpg";
-                imageNew = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + "_" + start + ".jpg";
-                File thumbFile = new File(thumbPath);
-                if (thumbFile.exists()) {
-                    thumbFile.renameTo(new File(thumbNew));
-                    InputStream is = new FileInputStream(thumbNew);
-                    ImageCompression.rotate(new File(thumbNew), new File(thumbPath), degree);
-                    is.close();
-                }
+                if (imageConfig.isCustomSubject()) {
+                    //阿里云oss图片旋转
+                    File sheetMkdir = new File(systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode());
+                    if (!sheetMkdir.exists()) {
+                        sheetMkdir.mkdirs();
+                    }
+                    File imageMkdir = new File(systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode());
+                    if (!imageMkdir.exists()) {
+                        imageMkdir.mkdirs();
+                    }
+                    String thumbDirName = aliYunOssConfig.getThumbDir();
+                    String imageDirName = aliYunOssConfig.getImageDir();
+                    thumbDirName = thumbDirName.substring(thumbDirName.indexOf(aliYunOssConfig.getBucket() + File.separator), thumbDirName.lastIndexOf("/")).replace(aliYunOssConfig.getBucket() + File.separator, "");
+                    imageDirName = imageDirName.substring(imageDirName.indexOf(aliYunOssConfig.getBucket() + File.separator), imageDirName.lastIndexOf("/")).replace(aliYunOssConfig.getBucket() + File.separator, "");
+                    StringJoiner thumbSj = new StringJoiner("").add(thumbDirName).add(File.separator).add(String.valueOf(paper.getWorkId())).add(File.separator).add(paper.getSubject().toString()).add(File.separator).add(paper.getAreaCode()).add(File.separator).add(paper.getExamNumber()).add(".jpg");
+                    StringJoiner thumbNewSj = new StringJoiner("").add(thumbDirName).add(File.separator).add(String.valueOf(paper.getWorkId())).add(File.separator).add(paper.getSubject().toString()).add(File.separator).add(paper.getAreaCode()).add(File.separator).add(paper.getExamNumber()).add("_").add(String.valueOf(start)).add(".jpg");
+                    StringJoiner imageSj = new StringJoiner("").add(imageDirName).add(File.separator).add(String.valueOf(paper.getWorkId())).add(File.separator).add(paper.getSubject().toString()).add(File.separator).add(paper.getAreaCode()).add(File.separator).add(paper.getExamNumber()).add(".jpg");
+                    StringJoiner imageNewSj = new StringJoiner("").add(imageDirName).add(File.separator).add(String.valueOf(paper.getWorkId())).add(File.separator).add(paper.getSubject().toString()).add(File.separator).add(paper.getAreaCode()).add(File.separator).add(paper.getExamNumber()).add("_").add(String.valueOf(start)).add(".jpg");
 
 
-                File imageFile = new File(imagePath);
-                if (imageFile.exists()) {
-                    imageFile.renameTo(new File(imageNew));
-                    InputStream is = new FileInputStream(imageNew);
-                    ImageCompression.rotate(new File(imageNew), new File(imagePath), degree);
-                    is.close();
+                    thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + ".jpg";
+                    imagePath = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + ".jpg";
+                    File thumbFile = ossUtil.ossDownload(thumbSj.toString(), thumbPath);
+                    File imageFile = ossUtil.ossDownload(imageSj.toString(), imagePath);
+                    ImageCompression.rotate(thumbFile, new File(thumbPath), degree);
+                    ImageCompression.rotate(imageFile, new File(imagePath), degree);
+                    FileInputStream in = new FileInputStream(new File(imagePath));
+                    sliceMD5 = DigestUtils.md5Hex(in);
+                    in.close();
+                    ossUtil.ossCopy(thumbSj.toString(), thumbNewSj.toString());
+                    ossUtil.ossCopy(imageSj.toString(), imageNewSj.toString());
+                    ossUtil.ossUpload(thumbSj.toString(), new FileInputStream(thumbFile));
+                    ossUtil.ossUpload(imageSj.toString(), new FileInputStream(imageFile));
+                    thumbFile.delete();
+                    imageFile.delete();
+                } else {
+                    thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + ".jpg";
+                    thumbNew = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + "_" + start + ".jpg";
+                    imagePath = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + ".jpg";
+                    imageNew = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + paper.getExamNumber() + "_" + start + ".jpg";
+                    File thumbFile = new File(thumbPath);
+                    if (thumbFile.exists()) {
+                        thumbFile.renameTo(new File(thumbNew));
+                        InputStream is = new FileInputStream(thumbNew);
+                        ImageCompression.rotate(new File(thumbNew), new File(thumbPath), degree);
+                        is.close();
+                    }
+
+                    File imageFile = new File(imagePath);
+                    if (imageFile.exists()) {
+                        imageFile.renameTo(new File(imageNew));
+                        InputStream is = new FileInputStream(imageNew);
+                        ImageCompression.rotate(new File(imageNew), new File(imagePath), degree);
+                        is.close();
+                    }
+                    FileInputStream in = new FileInputStream(new File(imagePath));
+                    sliceMD5 = DigestUtils.md5Hex(in);
+                    in.close();
                 }
                 }
-                FileInputStream in = new FileInputStream(new File(imagePath));
-                sliceMD5 = DigestUtils.md5Hex(in);
-                in.close();
             }
             }
             long end = System.currentTimeMillis();
             long end = System.currentTimeMillis();
             LOGGER.info("生成缩略和裁切旋转图耗时:{},sliceMD5:{}", (end - start) / 1000 + "s", sliceMD5);
             LOGGER.info("生成缩略和裁切旋转图耗时:{},sliceMD5:{}", (end - start) / 1000 + "s", sliceMD5);
@@ -152,6 +198,8 @@ public class RotateTask implements Runnable {
             e.printStackTrace();
             e.printStackTrace();
         } catch (IOException ioe) {
         } catch (IOException ioe) {
             ioe.printStackTrace();
             ioe.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
         } finally {
         } finally {
             papers.remove(paper.getExamNumber());
             papers.remove(paper.getExamNumber());
         }
         }

+ 28 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/FileUtil.java

@@ -0,0 +1,28 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import java.io.File;
+
+public class FileUtil {
+
+    /**
+     * 删除文件夹
+     *
+     * @param file
+     */
+    public static void deleteFile(File file) throws Exception {
+        //取得这个目录下的所有子文件对象
+        File[] files = file.listFiles();
+        //遍历该目录下的文件对象
+        for (File f : files) {
+            //打印文件名
+            //判断子目录是否存在子目录,如果是文件则删除
+            if (f.isDirectory()) {
+                deleteFile(f);
+            } else {
+                f.delete();
+            }
+        }
+        //删除空文件夹  for循环已经把上一层节点的目录清空。
+        file.delete();
+    }
+}

+ 109 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/OssUtil.java

@@ -0,0 +1,109 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import cn.com.qmth.stmms.ms.commons.config.AliYunOssConfig;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.CopyObjectResult;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @Description: oss工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/4
+ */
+@Component
+public class OssUtil {
+
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(OssUtil.class);
+
+    @Resource
+    AliYunOssConfig aliYunOssConfig;
+
+    /**
+     * oss上传文件
+     *
+     * @param dirName
+     * @param inputStream
+     */
+    public void ossUpload(String dirName, InputStream inputStream) {
+        LOGGER.info("ossUpload is come in");
+        // Endpoint以杭州为例,其它Region请按实际情况填写。
+        String endpoint = aliYunOssConfig.getEndpoint();
+        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+        String accessKeyId = aliYunOssConfig.getAccessKeyId();
+        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
+        String bucketName = aliYunOssConfig.getBucket();
+        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+        String objectName = dirName;
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。
+        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
+        PutObjectResult por = ossClient.putObject(putObjectRequest);
+        LOGGER.info("objectName:{},requestid:{}", objectName, por.getRequestId());
+    }
+
+    /**
+     * oss copy
+     *
+     * @param dirName
+     * @param dirNewName
+     */
+    public void ossCopy(String dirName, String dirNewName) {
+        LOGGER.info("ossCopy is come in");
+        // Endpoint以杭州为例,其它Region请按实际情况填写。
+        String endpoint = aliYunOssConfig.getEndpoint();
+        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+        String accessKeyId = aliYunOssConfig.getAccessKeyId();
+        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
+        String sourceBucketName = aliYunOssConfig.getBucket();
+        String sourceObjectName = dirName;
+        String destinationBucketName = aliYunOssConfig.getBucket();
+        String destinationObjectName = dirNewName;
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 拷贝文件。
+        CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
+        LOGGER.info("ETag:{},LastModified:{}", result.getETag(), result.getLastModified());
+        // 关闭OSSClient。
+        ossClient.shutdown();
+    }
+
+    /**
+     * 从oss上下载文件到本地
+     *
+     * @param dirName
+     * @param localPath
+     * @throws IOException
+     */
+    public File ossDownload(String dirName, String localPath) throws IOException {
+        LOGGER.info("ossDownload is come in");
+        // Endpoint以杭州为例,其它Region请按实际情况填写。
+        String endpoint = aliYunOssConfig.getEndpoint();
+        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+        String accessKeyId = aliYunOssConfig.getAccessKeyId();
+        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
+        String bucketName = aliYunOssConfig.getBucket();
+        // <yourObjectName>从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+        String objectName = dirName;
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
+        File localFile = new File(localPath);
+        ossClient.getObject(new GetObjectRequest(bucketName, objectName), localFile);
+        // 关闭OSSClient。
+        ossClient.shutdown();
+        return localFile;
+    }
+}

+ 25 - 25
stmms-ms-commons/src/test/java/cn/com/qmth/stmms/ms/commons/image/ImageThumberTest.java

@@ -1,25 +1,25 @@
-package cn.com.qmth.stmms.ms.commons.image;
-
-import javafx.application.Application;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.io.IOException;
-
-/**
- * Created by zhengmin on 2016/11/18.
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = Application.class)
-public class ImageThumberTest {
-
-    @Test
-    public void test() throws IOException {
-//        String s = "SC:1,SX:1,SM:0";
-//        String r = s.replaceFirst("Ss:[0-1]","SX:3");
-//        int c = 1;
-//        System.out.println(c++);
-    }
-}
+//package cn.com.qmth.stmms.ms.commons.image;
+//
+//import javafx.application.Application;
+//import org.junit.Test;
+//import org.junit.runner.RunWith;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.test.context.junit4.SpringRunner;
+//
+//import java.io.IOException;
+//
+///**
+// * Created by zhengmin on 2016/11/18.
+// */
+//@RunWith(SpringRunner.class)
+//@SpringBootTest(classes = Application.class)
+//public class ImageThumberTest {
+//
+//    @Test
+//    public void test() throws IOException {
+////        String s = "SC:1,SX:1,SM:0";
+////        String r = s.replaceFirst("Ss:[0-1]","SX:3");
+////        int c = 1;
+////        System.out.println(c++);
+//    }
+//}