1
0
Prechádzať zdrojové kódy

增加统一的原图读取接口(JAVA实现版本),并默认加上轨迹还原功能

luoshi 6 rokov pred
rodič
commit
12ea993d43

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -745,7 +745,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 // 原图中需要显示的内容列表
                 List<OriginTag> originTags = new LinkedList<>();
                 // 首先添加本大题总得分
-                originTags.add(new OriginTag(format.format(score), 0, 0));
+                originTags.add(new OriginTag(format.format(score), 0.1, 0.01));
                 // 检测应该使用哪个评卷任务的轨迹记录
                 MarkLibrary selected = null;
                 List<MarkLibrary> libraries = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());

+ 12 - 16
stmms-common/src/main/java/cn/com/qmth/stmms/common/upyun/UpYun.java

@@ -3,7 +3,6 @@ package cn.com.qmth.stmms.common.upyun;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -464,7 +463,7 @@ public class UpYun {
             is = new FileInputStream(file);
 
             // 获取链接
-            URL url = new URL("http://" + apiDomain + filePath);
+            URL url = new URL("https://" + apiDomain + filePath);
             conn = (HttpURLConnection) url.openConnection();
 
             // 设置必要参数
@@ -562,14 +561,14 @@ public class UpYun {
      * 
      * @param filePath
      *            文件路径(包含文件名)
-     * @param file
-     *            临时文件
+     * @param out
+     *            输出流
      * 
      * @return true or false
      */
-    public boolean readFile(String filePath, File file) {
+    public boolean readFile(String filePath, OutputStream out) {
 
-        String result = HttpAction(METHOD_GET, formatPath(filePath), null, file, false);
+        String result = HttpAction(METHOD_GET, formatPath(filePath), null, out, false);
 
         return "".equals(result);
     }
@@ -848,9 +847,9 @@ public class UpYun {
      * 
      * @return 请求结果(字符串)或 null
      */
-    private String HttpAction(String method, String uri, byte[] datas, File outFile, boolean auto) {
+    private String HttpAction(String method, String uri, byte[] datas, OutputStream out, boolean auto) {
 
-        return HttpAction(method, uri, datas, outFile, auto, null);
+        return HttpAction(method, uri, datas, out, auto, null);
     }
 
     /**
@@ -862,8 +861,8 @@ public class UpYun {
      *            请求地址
      * @param datas
      *            该请求所需发送数据(可为 null)
-     * @param outFile
-     *            文件描述符(可为 null)
+     * @param out
+     *            输出流(可为 null)
      * @param auto
      *            自动创建父级目录(最多10级)
      * @param params
@@ -872,7 +871,7 @@ public class UpYun {
      * @return 请求结果(字符串)或 null
      */
     @SuppressWarnings("resource")
-    private String HttpAction(String method, String uri, byte[] datas, File outFile, boolean auto,
+    private String HttpAction(String method, String uri, byte[] datas, OutputStream out, boolean auto,
             Map<String, String> params) {
         String result = null;
 
@@ -948,21 +947,18 @@ public class UpYun {
                 os.flush();
             }
 
-            if (outFile == null) {
-
+            if (out == null) {
                 result = getText(conn, METHOD_HEAD.equals(method));
-
             } else {
                 result = "";
 
-                os = new FileOutputStream(outFile);
                 byte[] data = new byte[4096];
                 int temp = 0;
 
                 is = conn.getInputStream();
 
                 while ((temp = is.read(data)) != -1) {
-                    os.write(data, 0, temp);
+                    out.write(data, 0, temp);
                 }
             }
         } catch (IOException e) {

+ 5 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/PictureUrlBuilder.java

@@ -40,6 +40,11 @@ public class PictureUrlBuilder {
         return list;
     }
 
+    public static String getSheetUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
+        return MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
+                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
+    }
+
     public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber,
             int count) {
         List<String> list = new LinkedList<String>();

+ 109 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/PictureController.java

@@ -0,0 +1,109 @@
+package cn.com.qmth.stmms.api.controller;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import cn.com.qmth.stmms.admin.utils.UpyunConfig;
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.utils.PictureTag;
+import cn.com.qmth.stmms.common.upyun.UpYun;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+
+@Controller("pictureController")
+@RequestMapping("/api")
+public class PictureController {
+
+    protected static final Logger log = LoggerFactory.getLogger(PictureController.class);
+
+    @Autowired
+    private CampusService campusService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private UpyunConfig config;
+
+    @Value("${sheet.image.server}")
+    private String sheetServer;
+
+    @Value("${file.root}")
+    private String baseDir;
+
+    @RequestMapping("/sheet/{examId}/{examNumber}-{index}")
+    public void getSheet(HttpServletResponse response, @PathVariable Integer examId, @PathVariable String examNumber,
+            @PathVariable Integer index, @RequestParam(required = false, defaultValue = "true") Boolean withTag)
+            throws IOException {
+        ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
+        if (student == null || !student.isUpload() || index < 1 || index > student.getSheetCount()) {
+            response.sendError(HttpStatus.NOT_FOUND.value());
+            return;
+        }
+        try {
+            BufferedImage image = getSheetImage(student, index);
+            if (withTag != null && withTag.booleanValue()) {
+                List<PictureTag> tags = studentService.buildSheetTags(student).get(index);
+                if (!tags.isEmpty()) {
+                    BufferedImage newImg = new BufferedImage(image.getWidth(), image.getHeight(),
+                            BufferedImage.TYPE_INT_RGB);
+                    Graphics2D g = newImg.createGraphics();
+                    g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
+                    g.setColor(Color.RED);
+                    g.setFont(new Font("Arial", Font.PLAIN, 50));
+                    for (PictureTag tag : tags) {
+                        g.drawString(tag.getContent(), tag.getLeft(), tag.getTop());
+                    }
+                    g.dispose();
+                    image = newImg;
+                }
+            }
+            response.setContentType("image/jpeg");
+            ImageIO.write(image, "jpg", response.getOutputStream());
+        } catch (Exception e) {
+            log.error("get sheet error", e);
+            response.reset();
+            response.sendError(HttpStatus.NOT_FOUND.value());
+            return;
+        }
+    }
+
+    private BufferedImage getSheetImage(ExamStudent student, int index) throws FileNotFoundException, IOException {
+        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
+        String url = PictureUrlBuilder.getSheetUrl(student.getExamId(), campus.getId(), student.getSubjectCode(),
+                student.getExamNumber(), index);
+        if (StringUtils.isNotBlank(baseDir)) {
+            return ImageIO.read(new File(baseDir, url));
+        } else {
+            UpYun upyun = new UpYun(config.getSheetBucket(), config.getSheetUsername(), config.getSheetPassword());
+            ByteArrayOutputStream ous = new ByteArrayOutputStream();
+            upyun.readFile(url, ous);
+            return ImageIO.read(new ByteArrayInputStream(ous.toByteArray()));
+        }
+    }
+
+}

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/application.properties

@@ -14,7 +14,7 @@ cookie.path=/
 slice.image.server=https://ft-slice.markingcloud.com
 sheet.image.server=https://ft-sheet.markingcloud.com
 package.image.server=https://ft-package.markingcloud.com
-card.server=http://ft-card.markingcloud.com
+card.server=https://ft-card.markingcloud.com
 ##slice.image.server=http://${local.ip}:9000/gx-slice
 ##sheet.image.server=http://${local.ip}:9000/gx-sheet
 ##package.image.server=http://${local.ip}:9000/gx-package