Vue.Js 및 자바 파일 분할 업로드 코드 인 스 턴 스 구현

설명 하 다.
코드 는 프로젝트 에서 수정 되 고 테스트 를 거치 지 않 고 아이디어 만 제공 합 니 다.
전단

upload(file) {
 //               
 getIdx(md5)
  .then(function(res) {
   let retry = 3;
   uploadPart(retry, file, res.data);
  })
  .catch(); 
}

uploadPart(retry, file, idx) {
 //      (  Byte)
 let bufferLength = 1024 * 1024 * 5;
 //        ,idx         ,           0
 let start = idx * bufferLength;
 //                
 if(start>=file.size || retry<=0) return;
 //       
 let end = start + bufferLength;
 //           ,     
 if (end > file.size) {end = fileSize;}
 //    
 var chunk = file.slice(start, end);
 //   formData        
 let formData = new FormData();
 formData.set("file", chunk);
 //        ,          
 if (start == 0) { 
  //        ,    
  let chunkNum = Math.ceil(file.size / bufferLength);
  formData.set("total", chunkNum);
 }
 //     api,    axios    
 doUpload(formData)
  //    ,      ,      
  .then(function() {
   retry = xx;//      
   uploadPart(retry, file, ++idx);
  })
  //    
  .catch(function() {
   retry--;//      
   //       
   uploadPart(retry, file, idx);
  });
},
파일 분할 업로드 전단 키 코드 는 다음 과 같 습 니 다.
//파일 자 르 기
var chunk = file.slice(start, end);
slice 방법 을 통 해 파일 을 절단 한 다음 에 파일 업로드 의 절 차 는 업무 와 구체 적 인 기술 에 따라 정 해 집 니 다.여 기 는 axios 로 요청 을 보 내 고 파일 블록 을 재 귀적 으로 호출 합 니 다.
주의해 야 할 것 은 Blob.slice(start,end)입 니 다.파일 블록 은 start 가 가리 키 는 바 이 트 를 포함 하고 end 가 가리 키 는 바 이 트 를 포함 하지 않 습 니 다.사용 할 때 Blob 의 경 계 를 주의해 야 합 니 다.
모 질 라 의 slice 에 대한 설명
백 엔 드

/**         */
public static void doMergeFiles(String outFile, String[] files) {
  //      
  int BUFSIZE = 1024 * 1024;
  //  。           。
  Arrays.sort(files);
  //   
  FileChannel outChannel = null;
  //         
  String lastFlag = files[files.length-1];
  try {
    outChannel = new FileOutputStream(outFile).getChannel();
    //      
    for(String f : files){
      //               ,           md5   
      if(lastFlag.equals(f)){
        File last = new File(f);
        BUFSIZE = (int) last.length();//                
      }
      FileChannel fc = new FileInputStream(f).getChannel();
      // ByteBuffer    
      ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);
      while(fc.read(bb) != -1){//       
        bb.flip();//    
        outChannel.write(bb);//    
        bb.clear();//    
      }
      fc.close();//   
    }
  } catch (IOException ioe) {
    ioe.printStackTrace();
  } finally {
    try {if (outChannel != null) {outChannel.close();}} catch (IOException ignore) {}
  }
}
  백 엔 드 의 관건 은 파일 을 통합 하 는 것 입 니 다.마지막 파일 을 업로드 하면 파일 을 통합 하 는 것 입 니 다.ByteBuffer 캐 시 를 사용 하여 FileChannel 을 사용 하여 파일 읽 기와 쓰기 가 통합 되 었 습 니 다.파일 을 저장 할 때 파일 이름 이 일치 하고 파일 의 접미사 이름 은 파일 블록 순 서 를 가 져 옵 니 다.예 를 들 어 첫 번 째 파일 은'xxx.01'이 고 10 번 째 파일 은'xxx.10'입 니 다.한 자릿수 앞 에'0'을 추가 하면 Array.sort()로 정렬 할 수 있 습 니 다.
*8195:8195:성능 을 향상 시 키 기 위해 캐 시 크기 를 적당 하 게 설정 할 수 있 습 니 다.파일 을 올 리 면서 합 칠 수 있 습 니 다.파일 이 올 라 올 때 까지 기다 리 지 않 아 도 됩 니 다.
넓히다
  이곳 의 파일 업 로드 는 한 번 에 한 조각 씩 업로드 되 었 고 업로드 에 성공 해서 야 다음 영 화 를 업로드 하기 시작 했다.전단 에 자바 script 을 사용 하지 않 고 다 중 스 레 드 를 사용 할 수 있다 면 여러 개의 파일 을 동시에 업로드 하여 업로드 속 도 를 높 일 수 있 습 니 다.업 로드 된 파일 조각 은 bitmap 로 저장 되 어 있 습 니 다.파일 을 업로드 하기 전에 배경 에서 업 로드 된 파일 조각 을 가 져 온 bitmap 데 이 터 를 분석 하고 업로드 되 지 않 은 파일 조각 을 다 중 스 레 드 로 처리 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기