瀏覽代碼

修改音频文件 上传BUG

chenken 7 年之前
父節點
當前提交
8a47d6ff7a

+ 0 - 1
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/AudioTimeConfigRepo.java

@@ -6,7 +6,6 @@ import org.springframework.data.mongodb.repository.MongoRepository;
 import org.springframework.data.repository.query.QueryByExampleExecutor;
 
 import com.qmth.cqb.paper.model.AudioTimeConfig;
-import com.qmth.cqb.paper.model.PaperDetailUnit;
 
 /**
  * @author  	chenken

+ 77 - 90
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java

@@ -12,6 +12,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -20,6 +21,7 @@ import com.qmth.cqb.utils.exception.PaperException;
 
 import main.java.com.UpYun;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.nlpcn.commons.lang.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -113,22 +115,22 @@ public class PaperService {
 	private QuestionAudioRepo questionAudioRepo;
     
     @Value("${upyun.radioType}")
-	protected String radioType;
+    private String radioType;
     
     @Value("${upyun.audio.maxsize}")
-    protected String maxsize;
+    private String audioMaxsize;
     
     @Value("${upyun.audio.uploadUrl}")
-   	protected String upyunRadioPath;
+    private String upyunRadioPath;
     
     @Value("${upyun.bucketName}")
-	protected String bucketName;
+    private String bucketName;
 	
 	@Value("${upyun.userName}")
-	protected String userName;
+	private String userName;
 	
 	@Value("${upyun.password}")
-	protected String password;
+	private String password;
     
     public static final String TEMP_FILE_EXP = "docxExport/";
 
@@ -992,85 +994,73 @@ public class PaperService {
      * @throws IOException
      */
     public void uploadRadio(List<MultipartFile> files,String paperId,AccessUser accessUser) throws IOException{
-    	String mp3DirectoryPath = TEMP_FILE_EXP + File.separator + paperId;
-    	//新建文件夹
-    	File mp3Directory = new File(mp3DirectoryPath);
-    	if(!mp3Directory.exists()){
-    		mp3Directory.mkdirs();
-    	}
-    	byte[] bufs = new byte[1024 * 10];
+    	//根据试卷id,查询该试卷
+    	Paper paper = paperRepo.findOne(paperId);
     	for(MultipartFile file: files){
     		//判断文件大小
     		long fileSize = file.getSize();
-    		int size =  Integer.parseInt(maxsize);
+    		int size =  Integer.parseInt(audioMaxsize);
     		if(fileSize>size * 1048576){
-    			throw new RuntimeException("音频文件超过5M"); 
+    			throw new RuntimeException("音频文件大小超过5M,不能上传"); 
     		}
-    		//新建MP3文件
+    		//根据试卷查询所有的小题,根据文件名匹配出当前小题ID
     		String questionId = ""; 
     		String numbers[] = file.getOriginalFilename().split("_");
-    		//根据试卷id,查询该试卷
-        	Paper paper = paperRepo.findOne(paperId);
-        	//根据试卷查询所有的小题
         	List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
         	for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
         		if(paperDetailUnit.getNumber().toString().equals(numbers[0])){
         			questionId = paperDetailUnit.getQuestion().getId();
         		}
         	}
-        	String mp3FileNameString = questionId + "_" + file.getOriginalFilename();
-    		File mp3File = new File(mp3DirectoryPath + File.separator +mp3FileNameString);
-    		FileOutputStream outputStream = new FileOutputStream(mp3File);
-    		BufferedInputStream bis = new BufferedInputStream(file.getInputStream(),1024*10);
-    		int read = 0;
-    		while ((read = bis.read(bufs,0,1024*10)) != -1) {
-    			outputStream.write(bufs,0,read);
-			}
-    		bis.close();
-    		outputStream.flush();
-    		outputStream.close();
-    		//上传到又拍云
-    		UpYun upYun = new UpYun(bucketName, userName, password);
-    		upYun.writeFile(upyunRadioPath+mp3FileNameString, mp3File,true);
-    		//删除服务器上文件
-    		mp3File.delete();
+        	uploadAudioFile(paperId,questionId,file,accessUser);
+        	appendAudioTag(file.getOriginalFilename(),questionId);
     	}
+    	paper.setHasAudio(true);
+    	paperRepo.save(paper);
     	//删除服务器文件夹
-    	mp3Directory.delete();
-    	saveQuestionAudio(files, paperId, accessUser);
-    	appendAudioTag(files,paperId);
+    	String mp3DirectoryPath = TEMP_FILE_EXP + File.separator + paperId;
+    	File mp3Directory = new File(mp3DirectoryPath);
+    	FileUtils.deleteDirectory(mp3Directory);
     }
     
     /**
-     * 保存音频文件到本地
-     * @param files
+     * 上传音频文件至又拍云
      * @param paperId
-     * @param accessUser
+     * @param questionId
+     * @param file
      */
-    public void saveQuestionAudio(List<MultipartFile> files,String paperId,AccessUser accessUser){
-    	for(MultipartFile file:files){
-    		String questionId = ""; 
-    		String numbers[] = file.getOriginalFilename().split("_");
-    		//根据试卷id,查询该试卷
-        	Paper paper = paperRepo.findOne(paperId);
-        	paper.setHasAudio(true);
-        	paperRepo.save(paper);
-        	//根据试卷查询所有的小题
-        	List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
-        	for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
-        		if(paperDetailUnit.getNumber().toString().equals(numbers[0])){
-        			questionId = paperDetailUnit.getQuestion().getId();
-        		}
-        	}
-        	QuestionAudio questionAudio = new QuestionAudio();
-        	questionAudio = questionAudioService.findByQuestionIdAndFileName(questionId, file.getOriginalFilename());
-        	if(questionAudio != null){
-        		questionAudioRepo.delete(questionAudio);
-        	}
-        	String fileUrl = upyunRadioPath + questionId+ "_" + file.getOriginalFilename();
-        	questionAudio = new QuestionAudio(paperId,questionId, file.getOriginalFilename(), fileUrl);
-        	questionAudioService.saveQuestionAudio(questionAudio, accessUser);
-    	}
+    private void uploadAudioFile(String paperId,String questionId,MultipartFile file,AccessUser accessUser){
+    	try {
+	    	String mp3DirectoryPath = TEMP_FILE_EXP + File.separator + paperId;
+	    	//新建文件夹
+	    	File mp3Directory = new File(mp3DirectoryPath);
+	    	if(!mp3Directory.exists()){
+	    		mp3Directory.mkdirs();
+	    	}
+	    	byte[] bufs = new byte[1024 * 4];
+	    	//使用随机数,防止缓存
+	    	Random random = new Random();
+	    	int randomNumber = random.nextInt(10000);
+	    	String mp3FileNameString = questionId+"_"+randomNumber+"_"+ file.getOriginalFilename();
+			File mp3File = new File(mp3DirectoryPath + File.separator +mp3FileNameString);
+			FileOutputStream outputStream = new FileOutputStream(mp3File);
+			BufferedInputStream bis = new BufferedInputStream(file.getInputStream(),1024*10);
+			int read = 0;
+			while ((read = bis.read(bufs,0,1024*4)) != -1) {
+				outputStream.write(bufs,0,read);
+			}
+			bis.close();
+			outputStream.flush();
+			outputStream.close();
+			//上传到又拍云
+			UpYun upYun = new UpYun(bucketName, userName, password);
+			upYun.writeFile(upyunRadioPath+mp3FileNameString, mp3File,true);
+			mp3File.delete();
+			//保存记录
+			questionAudioService.saveQuestionAudio(new QuestionAudio(questionId,file.getOriginalFilename(),upyunRadioPath+mp3FileNameString),accessUser);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
     }
     
     /**
@@ -1078,40 +1068,37 @@ public class PaperService {
      * @param files
      * @param paperId
      */
-    public void appendAudioTag(List<MultipartFile> files,String paperId){
-    	for(MultipartFile file:files){
-    		QuestionAudio questionAudio = questionAudioService.findByPaperIdAndFileName(paperId, file.getOriginalFilename());
-    		if(questionAudio == null){
-    			continue;
-    		}
-    		String numbers[] = file.getOriginalFilename().split("_");
-    		Question question = quesRepo.findOne(questionAudio.getQuestionId());
-    		question.setHasAudio(true);
-    		if(numbers[1].equals("1")){
-    			//Question question = quesRepo.findOne(questionAudio.getQuestionId());
-    			String quesBody = question.getQuesBody();
-    			String quesBodyNew = quesBody.substring(0, quesBody.lastIndexOf("</p>")) + "<a id=\"" + 
-    								 file.getOriginalFilename() + "\" name=\"" + file.getOriginalFilename() + "\"></a></p>";
-    			question.setQuesBody(quesBodyNew);
-    			quesRepo.save(question);
-    		}else {
-				//Question question = quesRepo.findOne(questionAudio.getQuestionId());
+    public void appendAudioTag(String fileName,String questionId){
+		QuestionAudio questionAudio = questionAudioService.findByQuestionIdAndFileName(questionId,fileName);
+		if(questionAudio != null){
+			String numbers[] = fileName.split("_");
+			Question question = quesRepo.findOne(questionAudio.getQuestionId());
+			question.setHasAudio(true);
+			if(numbers[1].equals("1")){
+				String quesBody = question.getQuesBody();
+				if(!quesBody.contains(fileName)){
+					String quesBodyNew = quesBody.substring(0, quesBody.lastIndexOf("</p>")) 
+							+ "<a id=\"" + fileName + "\" name=\"" + fileName + "\"></a></p>";
+					question.setQuesBody(quesBodyNew);
+				}
+			}else {
 				List<QuesOption> quesOptions = question.getQuesOptions();
 				List<QuesOption> quesOptionsNew = new ArrayList<QuesOption>();
 				for(QuesOption quesOption:quesOptions){
 					if(quesOption.getNumber().equals(CommonUtils.characterToNumber(numbers[2]).toString())){
 						String optionBody = quesOption.getOptionBody();
-						String optionBodyNew = optionBody.substring(0, optionBody.lastIndexOf("</p>")) + "<a id=\"" + 
-								 file.getOriginalFilename() + "\" name=\"" + file.getOriginalFilename() + "\"></a></p>";
-						quesOption.setOptionBody(optionBodyNew);
+						if(!optionBody.contains(fileName)){
+							String optionBodyNew = optionBody.substring(0, optionBody.lastIndexOf("</p>")) 
+									+ "<a id=\""+fileName+"\" name=\""+fileName+"\"></a></p>";
+							quesOption.setOptionBody(optionBodyNew);
+						}
 					}
 					quesOptionsNew.add(quesOption);
 				}
 				question.setQuesOptions(quesOptionsNew);
-				quesRepo.save(question);
 			}
-    	}
-    	
+			quesRepo.save(question);
+		}
     }
-    
+    	
 }

+ 0 - 1
cqb-question-resource/src/main/java/com/qmth/cqb/question/dao/QuestionAudioRepo.java

@@ -19,6 +19,5 @@ public interface QuestionAudioRepo extends MongoRepository<QuestionAudio, String
 
 	public QuestionAudio findByQuestionIdAndFileName(String questionId,String fileName);
 	
-	public QuestionAudio findByPaperIdAndFileName(String paperId,String fileName);
 }
 

+ 1 - 15
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/QuestionAudio.java

@@ -3,8 +3,6 @@ package com.qmth.cqb.question.model;
 import java.io.Serializable;
 import java.util.Date;
 
-import com.qmth.cqb.utils.enums.AudioPositionType;
-
 /**
  * @author  	chenken
  * @date    	2017年8月1日 上午10:56:23
@@ -18,11 +16,6 @@ public class QuestionAudio implements Serializable{
 	private static final long serialVersionUID = 7190928471784053821L;
 
 	private String id;
-	
-	/**
-	 * 试卷Id
-	 */
-	private String paperId;
 	/**
 	 * 试题ID
 	 */
@@ -52,8 +45,7 @@ public class QuestionAudio implements Serializable{
 	
 	public QuestionAudio(){}
 	
-	public QuestionAudio(String paperId,String questionId,String fileName,String fileUrl){
-		this.paperId = paperId;
+	public QuestionAudio(String questionId,String fileName,String fileUrl){
 		this.questionId = questionId;
 		this.fileName = fileName;
 		this.fileUrl = fileUrl;
@@ -95,11 +87,5 @@ public class QuestionAudio implements Serializable{
 	public void setCreateUser(String createUser) {
 		this.createUser = createUser;
 	}
-	public String getPaperId() {
-		return paperId;
-	}
-	public void setPaperId(String paperId) {
-		this.paperId = paperId;
-	}
 	
 }

+ 1 - 8
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuestionAudioService.java

@@ -14,7 +14,7 @@ import com.qmth.cqb.question.model.QuestionAudio;
  */
 public interface QuestionAudioService {
 	/**
-	 * 保存试题音频文件
+	 * 保存试题音频文件记录
 	 * @param questionRadio
 	 */
 	public void saveQuestionAudio(QuestionAudio questionAudio,AccessUser accessUser);
@@ -31,12 +31,5 @@ public interface QuestionAudioService {
 	 */
 	public QuestionAudio findByQuestionIdAndFileName(String questionId,String fileName);
 	
-	/**
-	 * 根据paperId和文件名称查询对象
-	 * @param paperId
-	 * @param fileName
-	 * @return
-	 */
-	public QuestionAudio findByPaperIdAndFileName(String paperId,String fileName);
 }
 

+ 18 - 7
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/impl/QuestionAudioServiceImpl.java

@@ -3,8 +3,11 @@ package com.qmth.cqb.question.service.impl;
 import java.util.Date;
 import java.util.List;
 
+import main.java.com.UpYun;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
@@ -26,8 +29,23 @@ public class QuestionAudioServiceImpl implements QuestionAudioService{
 	@Autowired
 	private QuestionAudioRepo questionAudioRepo;
 	
+	@Value("${upyun.bucketName}")
+	protected String bucketName;
+	
+	@Value("${upyun.userName}")
+	protected String userName;
+	
+	@Value("${upyun.password}")
+	protected String password;
+	
 	@Override
 	public void saveQuestionAudio(QuestionAudio questionAudio,AccessUser accessUser) {
+		QuestionAudio questionAudio2 = findByQuestionIdAndFileName(questionAudio.getQuestionId(),questionAudio.getFileName());
+    	if(questionAudio2 != null){
+    		UpYun upYun = new UpYun(bucketName, userName, password);
+    		upYun.deleteFile(questionAudio2.getFileUrl());
+    		questionAudioRepo.delete(questionAudio2);
+    	}
 		questionAudio.setCreateTime(new Date());
 		//questionAudio.setCreateUser(accessUser.getName());
 		questionAudioRepo.save(questionAudio);
@@ -47,13 +65,6 @@ public class QuestionAudioServiceImpl implements QuestionAudioService{
 		return questionAudioRepo.findByQuestionIdAndFileName(questionId,fileName);
 	}
 
-	@Override
-	public QuestionAudio findByPaperIdAndFileName(String paperId,String fileName) {
-		if(StringUtils.isBlank(paperId)||StringUtils.isBlank(fileName)){
-			return null;
-		}
-		return questionAudioRepo.findByPaperIdAndFileName(paperId, fileName);
-	}
 
 }
 

+ 3 - 3
cqb-starter/src/test/java/com/qmth/cqb/ExtractConfigServiceTest.java

@@ -151,10 +151,10 @@ public class ExtractConfigServiceTest {
 	}
 	@Test
 	public void testGetQuestionById(){
-		String examId = "67";
-		String paperDetailUnitId = "599aa4b36228dd2e60b47bdf";
+		String examId = "117";
+		String paperDetailUnitId = "59ace6ec0fe2d25e666b1a08";
 		String courseCode = "000008";
-		String groupCode = "A";
+		String groupCode = "O";
 		QuestionDto dto = extractConfigService.extractExamQuestion(examId,courseCode,groupCode,paperDetailUnitId);
 		System.out.println(dto.getQuesAnswer());
 	}