6.3.5.5 合并分块 在Service 中定义分块合并分块方法,功能如下: 1)将块文件合并 [mw_shl_code=applescript,true]//块文件上传 public ResponseResult uploadchunk(MultipartFile file, String fileMd5, String chunk) {
if(file == null){
ExceptionCast.cast(MediaCode.UPLOAD_FILE_REGISTER_ISNULL);
}
//创建块文件目录 boolean fileFold = createChunkFileFolder(fileMd5);
//块文件
File chunkfile = new File(getChunkFileFolderPath(fileMd5) + chunk);
//上传的块文件 InputStream inputStream= null;
FileOutputStream outputStream = null;
try {
inputStream = file.getInputStream();
outputStream = new FileOutputStream(chunkfile);
IOUtils.copy(inputStream,outputStream); } catch (Exception e) {
e.printStackTrace();
LOGGER.error("upload chunk file fail:{}",e.getMessage());
ExceptionCast.cast(MediaCode.CHUNK_FILE_UPLOAD_FAIL);
}finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return new ResponseResult(CommonCode.SUCCESS); }
//创建块文件目录 private boolean createChunkFileFolder(String fileMd5){
//创建上传文件目录
String chunkFileFolderPath = getChunkFileFolderPath(fileMd5);
File chunkFileFolder = new File(chunkFileFolderPath);
if (!chunkFileFolder.exists()) {
//创建文件夹
boolean mkdirs = chunkFileFolder.mkdirs();
return mkdirs;
}
return true;
}[/mw_shl_code] 6.3.5.5 合并分块 在Service 中定义分块合并分块方法,功能如下: 1)将块文件合并

2)校验文件md5是否正确 3)向Mongodb写入文件信息 //合并块文件


[mw_shl_code=applescript,true]public ResponseResult mergechunks(String fileMd5, String fileName, Long fileSize, String  mimetype, String fileExt) {  
   //获取块文件的路径   
  String chunkfileFolderPath = getChunkFileFolderPath(fileMd5);  
   File chunkfileFolder = new File(chunkfileFolderPath);   
  if(!chunkfileFolder.exists()){   
      chunkfileFolder.mkdirs();   
  }  
   //合并文件路径  
   File mergeFile = new File(getFilePath(fileMd5,fileExt));   
  //创建合并文件    
//合并文件存在先删除再创建  
   if(mergeFile.exists()){       
  mergeFile.delete();  
   }   
  boolean newFile = false;  
  try {  
       newFile = mergeFile.createNewFile(); 
    } catch (IOException e) {    
     e.printStackTrace();   
      LOGGER.error("mergechunks..create mergeFile fail:{}",e.getMessage()); 
    }     if(!newFile){      
   ExceptionCast.cast(MediaCode.MERGE_FILE_CREATEFAIL);  
   }    
//获取块文件,此列表是已经排好序的列表 
    List<File> chunkFiles = getChunkFiles(chunkfileFolder); 
    //合并文件   
  mergeFile = mergeFile(mergeFile, chunkFiles);  
   if(mergeFile == null){    
     ExceptionCast.cast(MediaCode.MERGE_FILE_FAIL);  
   }   
  //校验文件 
    boolean checkResult = this.checkFileMd5(mergeFile, fileMd5);   
  if(!checkResult){      
   ExceptionCast.cast(MediaCode.MERGE_FILE_CHECKFAIL);  
   }     
//将文件信息保存到数据库 
    MediaFile mediaFile = new MediaFile();   
  mediaFile.setFileId(fileMd5);   
  mediaFile.setFileName(fileMd5+"."+fileExt);    
mediaFile.setFileOriginalName(fileName); 
    //文件路径保存相对路径 
    mediaFile.setFilePath(getFileFolderRelativePath(fileMd5,fileExt)); 
    mediaFile.setFileSize(fileSize);  
   mediaFile.setUploadTime(new Date());   
  mediaFile.setMimeType(mimetype);  
   mediaFile.setFileType(fileExt);[/mw_shl_code]
[mw_shl_code=applescript,true]  
  //状态为上传成功  
   mediaFile.setFileStatus("301002");  
   MediaFile save = mediaFileDao.save(mediaFile);  
     return new ResponseResult(CommonCode.SUCCESS); }  //校验文件的md5值   
  private boolean checkFileMd5(File mergeFile,String md5){    
     if(mergeFile == null || StringUtils.isEmpty(md5)){   
          return false;    
     }   
      //进行md5校验   
      FileInputStream mergeFileInputstream = null;    
     try {      
       mergeFileInputstream = new FileInputStream(mergeFile);      
       //得到文件的md5         
    String  mergeFileMd5 = DigestUtils.md5Hex(mergeFileInputstream);        
     //比较md5        
     if(md5.equalsIgnoreCase(mergeFileMd5)){          
      return true;       
      }    
     } catch (Exception e) {  
           e.printStackTrace();      
       LOGGER.error("checkFileMd5 error,file is:{},md5 is: {}",mergeFile.getAbsoluteFile(),md5);      
   }finally{         
    try {       
          mergeFileInputstream.close();       
      } catch (IOException e) {     
            e.printStackTrace();     
        }     
    }      
     return false;  
     }    
//获取所有块文件  
   private List<File> getChunkFiles(File chunkfileFolder){   
      //获取路径下的所有块文件   
      File[] chunkFiles = chunkfileFolder.listFiles();      
   //将文件数组转成list,并排序   
      List<File> chunkFileList = new ArrayList<File>();    
     chunkFileList.addAll(Arrays.asList(chunkFiles));   
      //排序     
    Collections.sort(chunkFileList, new Comparator<File>() {  
           @Override         
    public int compare(File o1, File o2) {           
      if(Integer.parseInt(o1.getName())>Integer.parseInt(o2.getName())){           
          return 1;       
          }
                return ‐1;
            }         });     
    return chunkFileList;  
   }     //合并文件
     private File mergeFile(File mergeFile,List<File> chunkFiles){   
      try {          
   //创建写文件对象           
  RandomAccessFile raf_write = new RandomAccessFile(mergeFile,"rw");      
       //遍历分块文件开始合并      
       //读取文件缓冲区      
       byte[] b = new byte[1024];     
        for(File chunkFile:chunkFiles){    
             RandomAccessFile raf_read = new RandomAccessFile(chunkFile,"r");        
         int len = ‐1;           
      //读取分块文件         
        while((len = raf_read.read(b))!=‐1){    
                 //向合并文件中写数据          
           raf_write.write(b,0,len);     
            }          
       raf_read.close();    
         }        
     raf_write.close();   
      } catch (Exception e) {     
        e.printStackTrace();    
         LOGGER.error("merge file error:{}",e.getMessage());    
         return null;      
   }       
  return mergeFile;   
  }[/mw_shl_code]
6.3.5.6 Controller 
[mw_shl_code=applescript,true]@RestController @RequestMapping("/media/upload") public class MediaUploadController implements MediaUploadControllerApi {   
    @Autowired    
MediaUploadService mediaUploadService;  
     @Override    
  @PostMapping("/register")   
  public ResponseResult register(@RequestParam("fileMd5") String fileMd5,  @RequestParam("fileName") String fileName, @RequestParam("fileSize") Long fileSize,  @RequestParam("mimetype") String mimetype, @RequestParam("fileExt") String fileExt) {         return mediaUploadService.register(fileMd5,fileName,fileSize,mimetype,fileExt);     }   
    @Override   
  @PostMapping("/checkchunk")   
  public CheckChunkResult checkchunk(@RequestParam("fileMd5") String fileMd5, 
@RequestParam("chunk") Integer chunk, @RequestParam("chunkSize") Integer chunkSize) {         return mediaUploadService.checkchunk(fileMd5,chunk,chunkSize);   
  }     
  @Override   
   @PostMapping("/uploadchunk")   
  public ResponseResult uploadchunk(@RequestParam("file") MultipartFile file,  @RequestParam("fileMd5") String fileMd5, @RequestParam("chunk") Integer chunk) {    
     return mediaUploadService.uploadchunk(file,fileMd5,chunk);  
   }   
    @Override  
   @PostMapping("/mergechunks")  
   public ResponseResult mergechunks(@RequestParam("fileMd5") String fileMd5,  @RequestParam("fileName") String fileName, @RequestParam("fileSize") Long fileSize,  @RequestParam("mimetype") String mimetype, @RequestParam("fileExt") String fileExt) {         return mediaUploadService.mergechunks(fileMd5,fileName,fileSize,mimetype,fileExt);    
} }[/mw_shl_code]