Browse Source

图片旋转BUG修复

wangliang@qmth.com.cn 5 years ago
parent
commit
9e1078a2e0

+ 13 - 18
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -75,8 +75,6 @@ public class DataUploadService {
     public void uploadPaper(Long studentId, Subject subject, InputStream in, boolean isManual) throws Exception {
         long start = System.currentTimeMillis();
         LOGGER.info("准备生成裁切原图和缩略图:{}", start);
-        OutputStream outputStream = null;
-        OutputStream outputStreamTemp = null;
         File imageFileTemp = null;
         try {
             FileInputStream sheetIn = null;
@@ -95,8 +93,8 @@ public class DataUploadService {
                 File imageFile = new File(imageDir + File.separator + imageMd5 + ".jpg");
                 imageFileTemp = new File(imageDir + File.separator + imageMd5 + "temp.jpg");
                 LOGGER.info("image存放目录:{}", imageFile.getPath());
-                outputStream = new FileOutputStream(imageFile);
-                outputStreamTemp = new FileOutputStream(imageFileTemp);
+                OutputStream outputStream = new FileOutputStream(imageFile);
+                OutputStream outputStreamTemp = new FileOutputStream(imageFileTemp);
                 int index = 0;
                 byte[] bytes = new byte[1024];
                 byte[] bytesEnc = new byte[1024];
@@ -109,6 +107,11 @@ public class DataUploadService {
                     outputStream.write(bytesEnc, 0, index);
                     outputStreamTemp.write(bytes, 0, index);
                 }
+                in.close();
+                outputStream.flush();
+                outputStream.close();
+                outputStreamTemp.flush();
+                outputStreamTemp.close();
 
                 //生成缩略图
                 String thumbDir = systemConfig.getThumbDir() + File.separator + student.getWorkId() + File.separator + subject
@@ -121,15 +124,18 @@ public class DataUploadService {
                 BufferedImage bufferedImage = ImageCompression.compress(imageFileTemp, compressionConfig);
                 File thumbFile = new File(thumbDir + File.separator + imageMd5 + ".jpg");
                 LOGGER.info("thumb存放目录:{}", thumbFile.getPath());
-                outputStream = new FileOutputStream(thumbFile);
+                OutputStream outputStream1 = new FileOutputStream(thumbFile);
                 ByteArrayOutputStream os = new ByteArrayOutputStream();
                 ImageIO.write(bufferedImage, "jpg", os);
-                in = new ByteArrayInputStream(os.toByteArray());
+                InputStream in1 = new ByteArrayInputStream(os.toByteArray());
 
-                writeStream(in, outputStream);
+                writeStream(in1, outputStream1);
                 long end = System.currentTimeMillis();
                 LOGGER.info("生成原图和缩略图耗时:{}", (end - start) / 1000 + "s");
 
+                in1.close();
+                outputStream1.flush();
+                outputStream1.close();
                 sheetIn = new FileInputStream(imageFile.getPath());
                 slicein = new FileInputStream(thumbFile.getPath());
             } else {
@@ -204,17 +210,6 @@ public class DataUploadService {
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
-            if (Objects.nonNull(in)) {
-                in.close();
-            }
-            if (Objects.nonNull(outputStream)) {
-                outputStream.flush();
-                outputStream.close();
-            }
-            if (Objects.nonNull(outputStreamTemp)) {
-                outputStreamTemp.flush();
-                outputStreamTemp.close();
-            }
             //原图删除
             if (Objects.nonNull(imageFileTemp) && imageFileTemp.exists()) {
                 imageFileTemp.delete();

+ 9 - 4
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/WaterMarkUtils.java

@@ -146,6 +146,9 @@ public class WaterMarkUtils {
         InputStream inputStream = new FileInputStream(sourcePath + ".jpg");
         OutputStream outputStream = new FileOutputStream(sourceTempPath);
         SystemConstant.writeStream(inputStream, outputStream);
+        inputStream.close();
+        outputStream.flush();
+        outputStream.close();
         File source = new File(sourceTempPath);
         File destinationTemp = new File(destinationPath + "temp.jpg");
         BufferedImage image = ImageIO.read(source);
@@ -180,12 +183,14 @@ public class WaterMarkUtils {
         writer.dispose();
         w.dispose();
 
-        inputStream = new FileInputStream(destinationTemp);
-        outputStream.flush();
+        InputStream inputStream1 = new FileInputStream(destinationTemp);
         File watermarkFile = new File(destinationPath + ".jpg");
         LOGGER.info("watermark存放目录:{}", watermarkFile.getPath());
-        outputStream = new FileOutputStream(watermarkFile);
-        SystemConstant.writeStream(inputStream, outputStream);
+        OutputStream outputStream1 = new FileOutputStream(watermarkFile);
+        SystemConstant.writeStream(inputStream1, outputStream1);
+        inputStream1.close();
+        outputStream1.flush();
+        outputStream1.close();
 
         if (Objects.nonNull(source) && source.exists()) {
             source.delete();

+ 15 - 20
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -252,12 +252,9 @@ public class CollectApi {
                             HttpServletRequest request, HttpServletResponse response) throws IOException {
         long start = System.currentTimeMillis();
         LOGGER.info("准备生成裁切原图和缩略图:{}", start);
-        InputStream inputStream = null;
-        OutputStream outputStream = null;
-        OutputStream outputStreamTemp = null;
         File imageFileTemp = null;
         try {
-            inputStream = request.getInputStream();
+            InputStream inputStream = request.getInputStream();
 //            inputStream = new FileInputStream(srcFile);
             Student student = studentRepo.findByWorkIdAndExamNumber(workId, fileName);
             Subject subject = Subject.values()[subjectId - 1];
@@ -273,8 +270,8 @@ public class CollectApi {
             File imageFile = new File(imageDir + File.separator + imageMd5 + ".jpg");
             imageFileTemp = new File(imageDir + File.separator + imageMd5 + "temp.jpg");
             LOGGER.info("image存放目录:{}", imageFile.getPath());
-            outputStream = new FileOutputStream(imageFile);
-            outputStreamTemp = new FileOutputStream(imageFileTemp);
+            OutputStream outputStream = new FileOutputStream(imageFile);
+            OutputStream outputStreamTemp = new FileOutputStream(imageFileTemp);
             int index = 0;
             byte[] bytes = new byte[1024 * 8];
             byte[] bytesEnc = new byte[1024 * 8];
@@ -289,6 +286,12 @@ public class CollectApi {
                 outputStreamTemp.write(bytes, 0, index);
                 MD5.update(bytes, 0, index);
             }
+            inputStream.close();
+            outputStream.flush();
+            outputStream.close();
+            outputStreamTemp.flush();
+            outputStreamTemp.close();
+
             //生成缩略图
             String thumbDir = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
                     + File.separator + student.getAreaCode();
@@ -301,20 +304,23 @@ public class CollectApi {
             File thumbFile = new File(thumbDir + File.separator + imageMd5 + ".jpg");
 //            File thumbFileTemp = new File(thumbDir + File.separator + imageMd5 + "temp.jpg");
             LOGGER.info("thumb存放目录:{}", thumbFile.getPath());
-            outputStream = new FileOutputStream(thumbFile);
+            OutputStream outputStream1 = new FileOutputStream(thumbFile);
 //            outputStreamTemp = new FileOutputStream(thumbFileTemp);
 //            ImageIO.write(bufferedImage, "jpg", outputStreamTemp);
             ByteArrayOutputStream os = new ByteArrayOutputStream();
             ImageIO.write(bufferedImage, "jpg", os);
-            inputStream = new ByteArrayInputStream(os.toByteArray());
+            InputStream inputStream1 = new ByteArrayInputStream(os.toByteArray());
 
 //            inputStream = new FileInputStream(thumbFileTemp);
             //缩略图删除
 //            thumbFileTemp.delete();
-            SystemConstant.writeStream(inputStream, outputStream);
+            SystemConstant.writeStream(inputStream1, outputStream1);
             long end = System.currentTimeMillis();
             LOGGER.info("生成原图和缩略图耗时:{}", (end - start) / 1000 + "s");
 
+            inputStream1.close();
+            outputStream1.flush();
+            outputStream1.close();
             String md5 = request.getHeader("md5");
 //            FileInputStream in = new FileInputStream(imageFileTemp);
             String sliceMD5 = new String(Hex.encodeHex(MD5.digest()));
@@ -325,17 +331,6 @@ public class CollectApi {
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
-            if (Objects.nonNull(inputStream)) {
-                inputStream.close();
-            }
-            if (Objects.nonNull(outputStream)) {
-                outputStream.flush();
-                outputStream.close();
-            }
-            if (Objects.nonNull(outputStreamTemp)) {
-                outputStreamTemp.flush();
-                outputStreamTemp.close();
-            }
             //原图删除
             if (Objects.nonNull(imageFileTemp) && imageFileTemp.exists()) {
                 imageFileTemp.delete();

+ 93 - 61
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java

@@ -11,6 +11,7 @@ import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.FileCopyUtils;
 
 import java.io.*;
 import java.util.HashSet;
@@ -26,8 +27,7 @@ public class RotateTask implements Runnable {
     private SystemConfig systemConfig;
     private HashSet<String> papers;
 
-    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) {
         this.paper = paper;
         this.degree = degree;
         this.paperRepo = paperRepo;
@@ -48,69 +48,101 @@ public class RotateTask implements Runnable {
             String sliceMD5 = null;
             LOGGER.info("准备生成缩略和裁切旋转图:{}", start);
             if (imageConfig.isImageEnc()) {
-                Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
-                String imageMd5 = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), paper.getAreaCode(), paper.getExamNumber(), student.getId());
-                thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + imageMd5;
-                thumbNew = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + imageMd5;
-                imagePath = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + imageMd5;
-                imageNew = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
-                        + File.separator + paper.getAreaCode() + File.separator + imageMd5;
+                File thumbTempFile = null;
+                File imageTempFile = null;
+                try {
+                    Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
+                    String imageMd5 = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), paper.getAreaCode(), paper.getExamNumber(), student.getId());
+                    thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + imageMd5;
+                    thumbNew = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + imageMd5;
+                    imagePath = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + imageMd5;
+                    imageNew = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                            + File.separator + paper.getAreaCode() + File.separator + imageMd5;
 
-                //缩略图旋转生成
-                String thumbOldPath = thumbPath + ".jpg";
-                String thumbTempPath = thumbPath + "temp.jpg";
-                File thumbOldFile = new File(thumbOldPath);
-                //读取指定路径下面的文件
-                File thumbTempFile = new File(thumbTempPath);
-                InputStream is = new FileInputStream(thumbOldPath);
-                OutputStream outputStream = new FileOutputStream(thumbTempPath);
-                SystemConstant.writeStream(is, outputStream);
-                //生成旋转图
-                File thumbNewFile = new File(thumbNew + "_" + start + ".jpg");
-                thumbTempFile.renameTo(thumbNewFile);
-                ImageCompression.rotate(thumbNewFile, thumbTempFile, degree);
-                thumbOldFile.renameTo(thumbNewFile);
-                is = new FileInputStream(thumbTempFile);
-                File thumbRotate = new File(thumbPath + ".jpg");
-                outputStream = new FileOutputStream(thumbRotate);
-                SystemConstant.writeStream(is, outputStream);
-
-                //裁切原图旋转生成
-                String imageOldPath = imagePath + ".jpg";
-                String imageTempPath = imagePath + "temp.jpg";
-                File imageOldFile = new File(imageOldPath);
-                //读取指定路径下面的文件
-                File imageTempFile = new File(imageTempPath);
-                is = new FileInputStream(imageOldPath);
-                outputStream = new FileOutputStream(imageTempFile);
-                SystemConstant.writeStream(is, outputStream);
-                //生成旋转图
-                File imageNewFile = new File(imageNew + "_" + start + ".jpg");
-                imageTempFile.renameTo(imageNewFile);
-                ImageCompression.rotate(imageNewFile, imageTempFile, degree);
-                imageOldFile.renameTo(imageNewFile);
-                is = new FileInputStream(imageTempFile);
-                File imageRotate = new File(imagePath + ".jpg");
-                outputStream = new FileOutputStream(imageRotate);
-                SystemConstant.writeStream(is, outputStream);
-
-                is = new FileInputStream(imageRotate);
-                sliceMD5 = DigestUtils.md5Hex(is);
-                if (Objects.nonNull(is)) {
+                    //缩略图旋转生成
+                    String thumbOldPath = thumbPath + ".jpg";
+                    String thumbTempPath = thumbPath + "temp.jpg";
+                    File thumbOldFile = new File(thumbOldPath);
+                    //读取指定路径下面的文件
+                    thumbTempFile = new File(thumbTempPath);
+                    InputStream is = new FileInputStream(thumbOldPath);
+                    OutputStream outputStream = new FileOutputStream(thumbTempPath);
+                    SystemConstant.writeStream(is, outputStream);
                     is.close();
-                }
-                if (Objects.nonNull(outputStream)) {
                     outputStream.flush();
                     outputStream.close();
-                }
-                if (Objects.nonNull(thumbTempFile) && thumbTempFile.exists()) {
-                    thumbTempFile.delete();
-                }
-                if (Objects.nonNull(imageTempFile) && imageTempFile.exists()) {
-                    imageTempFile.delete();
+
+                    //读取原图
+                    File thumbNewFile = new File(thumbNew + "_" + start + ".jpg");
+                    FileCopyUtils.copy(thumbTempFile, thumbNewFile);
+                    ImageCompression.rotate(thumbTempFile, thumbTempFile, degree);
+                    FileCopyUtils.copy(thumbTempFile, thumbOldFile);
+                    InputStream is1 = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(thumbNewFile));
+                    //加密原图
+                    OutputStream outputStream1 = new FileOutputStream(thumbNewFile);
+                    SystemConstant.writeStream(is1, outputStream1);
+                    is1.close();
+                    outputStream1.flush();
+                    outputStream1.close();
+
+                    //生成旋转图和加密
+                    InputStream is2 = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(thumbOldFile));
+                    OutputStream outputStream2 = new FileOutputStream(thumbOldFile);
+                    SystemConstant.writeStream(is2, outputStream2);
+                    is2.close();
+                    outputStream2.flush();
+                    outputStream2.close();
+
+                    //裁切原图旋转生成
+                    String imageOldPath = imagePath + ".jpg";
+                    String imageTempPath = imagePath + "temp.jpg";
+                    File imageOldFile = new File(imageOldPath);
+                    //读取指定路径下面的文件
+                    imageTempFile = new File(imageTempPath);
+                    InputStream is3 = new FileInputStream(imageOldPath);
+                    OutputStream outputStream3 = new FileOutputStream(imageTempFile);
+                    SystemConstant.writeStream(is3, outputStream3);
+                    is3.close();
+                    outputStream3.flush();
+                    outputStream3.close();
+
+                    //读取原图
+                    File imageNewFile = new File(imageNew + "_" + start + ".jpg");
+                    FileCopyUtils.copy(imageTempFile, imageNewFile);
+                    ImageCompression.rotate(imageTempFile, imageTempFile, degree);
+                    FileCopyUtils.copy(imageTempFile, imageOldFile);
+                    InputStream is4 = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(imageNewFile));
+                    //加密原图
+                    OutputStream outputStream4 = new FileOutputStream(imageNewFile);
+                    SystemConstant.writeStream(is4, outputStream4);
+                    is4.close();
+                    outputStream4.flush();
+                    outputStream4.close();
+
+                    //生成旋转图和加密
+                    InputStream is5 = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(imageOldFile));
+                    OutputStream outputStream5 = new FileOutputStream(imageOldFile);
+                    SystemConstant.writeStream(is5, outputStream5);
+                    is5.close();
+                    outputStream5.flush();
+                    outputStream5.close();
+
+                    InputStream is6 = new FileInputStream(imageNewFile);
+                    sliceMD5 = DigestUtils.md5Hex(is6);
+                    is6.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+//                    System.gc();
+                    if (Objects.nonNull(thumbTempFile) && thumbTempFile.exists()) {
+                        thumbTempFile.delete();
+                    }
+                    if (Objects.nonNull(imageTempFile) && imageTempFile.exists()) {
+                        imageTempFile.delete();
+                    }
                 }
             } else {
                 thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()