Jelajahi Sumber

Merge branch 'feature-oss-download' into 'DEV'

add resultZip



See merge request !433

huangyong 7 tahun lalu
induk
melakukan
5b0d486828

+ 6 - 0
mooctest-site-server/pom.xml

@@ -274,6 +274,12 @@
             <artifactId>requests</artifactId>
             <version>4.7.3</version>
         </dependency>
+        <!-- ZIP -->
+        <dependency>
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+            <version>1.3.2</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 7 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/OSSController.java

@@ -82,4 +82,11 @@ public class OSSController extends BaseController {
         successResult.put("path", request.getHeader("Font-Address")+result);
         return successResult;
     }
+
+    @RequestMapping(value = UrlConstants.API_COMMON + "zip/file", method = RequestMethod.GET)
+    public String getZip(@RequestParam(value = "examId")Long examId,
+                         @RequestParam(value = "workerId")Long workerId,
+                         @RequestParam(value = "fileName")String fileName) throws Exception{
+        return ossLogic.zipFile(examId,workerId,fileName);
+    }
 }

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/AssignedTaskVO.java

@@ -39,6 +39,8 @@ public class AssignedTaskVO extends BaseVO {
 
     private Integer status;
 
+    private String resultZip;
+
     public Long getId() {
         return id;
     }
@@ -150,4 +152,12 @@ public class AssignedTaskVO extends BaseVO {
     public void setWorkerSchool(String workerSchool) {
         this.workerSchool = workerSchool;
     }
+
+    public String getResultZip() {
+        return resultZip;
+    }
+
+    public void setResultZip(String resultZip) {
+        this.resultZip = resultZip;
+    }
 }

+ 5 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/OSSLogic.java

@@ -30,7 +30,11 @@ public interface OSSLogic {
 
     String getSubmitSiganature(String path,Long examId,Long caseId,Long workerId,String fileName);
 
-    boolean downloadByUrl(String url,String file) throws Exception;
+    boolean downloadByUrl(String url,String file,String fileName) throws Exception;
 
     String saveFile(MultipartFile file, String path) throws IOException;
+
+    String zipFile(Long examId,Long workerId,String fileName) throws Exception;
+
+    String zipFilePath(String fileName);
 }

+ 5 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ExamLogicImpl.java

@@ -15,10 +15,7 @@ import cn.iselab.mooctest.site.web.data.wrapper.ScoreVOWrapper;
 import cn.iselab.mooctest.site.web.exception.AssignedTaskNotExistException;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
-import cn.iselab.mooctest.site.web.logic.BaseLogic;
-import cn.iselab.mooctest.site.web.logic.ContestLogic;
-import cn.iselab.mooctest.site.web.logic.ExamLogic;
-import cn.iselab.mooctest.site.web.logic.GroupLogic;
+import cn.iselab.mooctest.site.web.logic.*;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.convert.converter.Converter;
@@ -96,6 +93,9 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     @Autowired
     ReportPermissionService reportPermissionService;
 
+    @Autowired
+    OSSLogic ossLogic;
+
     @Override
     public ExamVO getExamById(long examId) {
         Task task = taskService.getTask(examId);
@@ -234,6 +234,7 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
                 vo.setWorkerName(participant.getName());
                 vo.setWorkerSchool(participant.getSchool());
                 vo.setAssignedCases(assignedCaseVOWrapper.wrap(assignedTaskService.wrapAssignedCases(assignedTask)));
+                vo.setResultZip(ossLogic.zipFilePath(participant.getName()+"_"+assignedTask.getName()));
                 return vo;
             }
         });

+ 45 - 7
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/OSSLogicImpl.java

@@ -7,14 +7,16 @@ import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.logic.OSSLogic;
 import com.aliyun.oss.HttpMethod;
 import com.aliyun.oss.OSSClient;
-import com.aliyun.oss.model.GeneratePresignedUrlRequest;
-import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.*;
 import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.exceptions.ClientException;
 import com.aliyuncs.http.MethodType;
 import com.aliyuncs.http.ProtocolType;
 import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
 import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
+import net.lingala.zip4j.core.ZipFile;
+import net.lingala.zip4j.model.ZipParameters;
+import net.lingala.zip4j.util.Zip4jConstants;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,9 +24,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.net.URL;
 import java.util.Date;
 import java.util.List;
@@ -58,6 +58,8 @@ public class OSSLogicImpl implements OSSLogic {
 
     private long maxUploadSizeInMb = 100 * 1024 * 1204; //100MB
     private String UPLOADED_PATH="/download/";
+    private String SAVE_PATH="/var/www/download/";
+    private String ZIP_PATH="zip/";
 
     @Override
     public String getAppPresignUrl(String appName) {
@@ -160,8 +162,7 @@ public class OSSLogicImpl implements OSSLogic {
     }
 
     @Override
-    public boolean downloadByUrl(String url,String filePath) throws Exception {
-        String fileName = FilenameUtils.getName(url);
+    public boolean downloadByUrl(String url,String filePath,String fileName) throws Exception {
         if (fileName == null)
             return false;
         File directory = new File(filePath);
@@ -202,4 +203,41 @@ public class OSSLogicImpl implements OSSLogic {
         file.transferTo(saveFile);
         return fileName;
     }
+
+    @Override
+    public String zipFile(Long examId,Long workerId,String fileName) throws Exception{
+        File file=new File(SAVE_PATH+ZIP_PATH+fileName+".zip");
+        if(!file.exists()){
+            File folder=new File(FileUtils.getUserDirectory()+"/"+fileName);
+            if(!folder.exists())
+                folder.mkdirs();
+            ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
+            ObjectListing listing=ossClient.listObjects(bucketNameDev,"data/answers"+"/"+examId+"/"+workerId+"/");
+            List<OSSObjectSummary> sums = listing.getObjectSummaries();
+            for (OSSObjectSummary s : sums) {
+                String key=s.getKey();
+                String name=key.split("/")[key.split("/").length - 1];
+                ossClient.getObject(new GetObjectRequest(bucketNameDev, key), new File(FileUtils.getUserDirectory()+"/"+fileName+"/"+name));
+            }
+            ossClient.shutdown();
+            ZipFile zipFile=new ZipFile(file);
+            ZipParameters parameters=new ZipParameters();
+            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
+            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
+            zipFile.addFolder(folder,parameters);
+            FileUtils.deleteQuietly(folder);
+        }
+        return UPLOADED_PATH+ZIP_PATH+fileName+".zip";
+    }
+
+    @Override
+    public String zipFilePath(String fileName){
+        File file=new File(SAVE_PATH+ZIP_PATH+fileName+".zip");
+        if(file.exists()){
+            return UPLOADED_PATH+ZIP_PATH+fileName+".zip";
+        }
+        else {
+            return null;
+        }
+    }
 }

+ 3 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ReportLogicImpl.java

@@ -36,6 +36,8 @@ import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
 import cn.iselab.mooctest.site.web.logic.OSSLogic;
 import cn.iselab.mooctest.site.web.logic.ReportLogic;
 import cn.iselab.mooctest.site.web.util.Converter;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.json.JSONArray;
@@ -200,7 +202,7 @@ public class ReportLogicImpl implements ReportLogic {
             if(report!=null) {
                 this.reportSum++;
                 try {
-                    if(ossLogic.downloadByUrl(report.getScriptLocation(), PathConstants.SCRIPTS+"/"+caseTake.getParticipantId())){
+                    if(ossLogic.downloadByUrl(report.getScriptLocation(), PathConstants.SCRIPTS+"/"+caseTake.getParticipantId(), FilenameUtils.getName(report.getScriptLocation()))){
                         this.fileSum++;
                     }
                 }catch (Exception e){