A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

6.3.5.5 合并分块
在Service 中定义分块合并分块方法,功能如下:
1)将块文件合并
[AppleScript] 纯文本查看 复制代码
//块文件上传 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;   
  }

6.3.5.5 合并分块
在Service 中定义分块合并分块方法,功能如下:
1)将块文件合并

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

[AppleScript] 纯文本查看 复制代码
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);

[AppleScript] 纯文本查看 复制代码
  
  //状态为上传成功  
   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;   
  }

6.3.5.6 Controller
[AppleScript] 纯文本查看 复制代码
@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);    
 } }


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马