SSM 프레임 워 크+Plupload 블록 별로 큰 파일 업로드 예제 구현

15460 단어 plupload업로드
Plupload 에 대한 소 개 는 홈 페이지 를 믿 습 니 다http://www.plupload.com/이미 상세 하 게 주 었 습 니 다.Plupload 의 업로드 원 리 는 쉽게 말 하면 사용자 가 선택 한 파일(여러 개 가능)을 작은 블록 으로 나 누 어 서버 에 순서대로 업로드 하 는 것 입 니 다.이것 은 큰 파일 을 업로드 하 는 것 을 제어 할 수 있 는 이유 중 하나 이 며,이 과정 에서 업 로드 를 중단 하고 중단 한 후에 계속 업로드 할 수 있 습 니 다(정지점 전송 과 다 름).무엇 보다 처음부터 끝까지 UI 차단 없 이 사용자 체험 을 보장 했다.다음은 Plupload 의 실현 절 차 를 설명 하고 원 리 를 분석 하 며 마지막 으로 효과 도 를 제시 합 니 다.
그 전에 제 프로젝트 에 대해 말씀 드 리 겠 습 니 다.제 가 만 든 j2ee 프로젝트 는 spring+SpringMVC+MyBatis 의 프레임 워 크 집합 에 활용 되 었 습 니 다.소 셜 네트워크 서비스 에 관 한 사이트 입 니 다.페 이 스 북,트 위 터,웨 이 보 등 과 같은 이름 으로 YouAndMe 라 고 지 었 습 니 다.나 는 이 프로젝트 에 사용자 자료 공유 플랫폼 이 있어 야 한다 고 대담 하 게 구상 했다.예 쁜 영화 나 드라마 한 세트,집에 서 필요 한 식단,예 쁜 풍경 도,각양각색 일 수도 있다.사용 자 는 원 하 는 자 료 를 검색 하고 다운로드 할 수 있다.그래서 우선 해결 해 야 할 것 은 각양각색의 파일 업로드 다.
1.Plupload 플러그 인 을 다운로드 하고 해당 파일 을 도입 합 니 다.
특히 이 플러그 인 은 전단 일 뿐 입 니 다.배경 에서 작은 블록 을 어떻게 통합 하 는 지 등 코드 는 스스로 써 야 합 니 다.
다운로드 주소:http://www.plupload.com/download저 는 Plupload 2.1.9 GPLv 2 버 전 을 내 렸 습 니 다.그 안에 사용 할 css 와 js 가 있 습 니 다.
프로젝트 에 도입 해 야 합 니 다:jQuery.pluproad.queue.css,jquery-2.0.0.min.js,pluproad.full.min.js,jquery.pluproad.queue.js,zhCN.js 파일 들
전단 준비
1.우선 html 에 다음 코드 를 기록 합 니 다.

<div id="uploader">
 <p>Your browser doesn't have Flash, Silverlight or HTML5 support.</p>
</div>
<button id="toStop">    </button>
<button id="toStart">    </button>
div 의 id 는 반드시 uploader 여야 합 니 다.이것 은 플러그 인 소스 코드 에 규정 되 어 있 습 니 다.아 이 디 는 tostop 과 tostart 의 단 추 를 제 가 추가 한 것 입 니 다.업로드 중단 과 일시 정지 후의 계속 업로드 하 는 것 을 실현 하기 위해 서 입 니 다.
2.페이지 불 러 온 후 js 를 통 해 구성 요소 초기 화

<script type="text/javascript">
 $(function() {
  // Initialize the widget when the DOM is ready
  var uploader = $("#uploader").pluploadQueue({
   // General settings
   runtimes: 'html5,flash,silverlight,html4',
   url: "../pluploadUpload",

   // Maximum file size
   max_file_size: '10000mb',

   chunk_size: '1mb',

   // Resize images on clientside if we can
   resize: {
    width: 200,
    height: 200,
    quality: 90,
    crop: true // crop to exact dimensions
   },

   // Specify what files to browse for
   filters: [
    {title: "Image files", extensions: "jpg,gif,png"},
    {title: "Vedio files", extensions: "mp4,mkv"},
    {title: "Zip files", extensions: "zip,avi"}
   ],

   // Rename files by clicking on their titles
   rename: true,

   // Sort files
   sortable: true,

   // Enable ability to drag'n'drop files onto the widget (currently only HTML5 supports that)
   dragdrop: true,

   // Views to activate
   views: {
    list: true,
    thumbs: true, // Show thumbs
    active: 'thumbs'
   },

   // Flash settings
   flash_swf_url: 'js/Moxie.swf',

   // Silverlight settings
   silverlight_xap_url: 'js/Moxie.xap'
  });

  $("#toStop").on('click', function () {
   uploader.stop();
  });

  $("#toStart").on('click', function () {
   uploader.start();
  });
 });
</script>

이 부분의 기능 에 대해 서 는 plplploadQueue 의 문 서 를 볼 수 있 습 니 다http://www.plupload.com/docs/pluploadQueue쉽게 알 아 볼 수 있 습 니 다.여기 서 일부 매개 변수의 의 미 를 간단하게 말 합 니 다.
url 은 서버 가 업로드 할 주 소 를 처리 하 는 것 입 니 다.filers 는 필터 라 는 뜻 으로 어떤 형식의 파일 을 업로드 할 수 있 는 지 규정 합 니 다.dragdrop:true 는 선택 상자 로 파일 을 끌 어 올 릴 수 있 도록 설정 되 어 있 습 니 다.
메모:업 로드 를 일시 정지 하고 계속 할 때 uploader.stop()과 uploader.start()를 사용 해 야 합 니 다.이 uploader 인 스 턴 스 는$("\#uploader").pluploadQueue({...})에서 발생 합 니 다.홈 페이지 에서 보 여 준 예 중 두 가지 상황 이 있 습 니 다.하 나 는 등록 할 때 한꺼번에 모든 인 자 를 지정 하 는 것 입 니 다.그러나 이것 은 uploader 인 스 턴 스 를 되 돌려 주지 않 습 니 다.둘째,등록 할 때 인 자 를 주지 않 으 면 uploader 인 스 턴 스 를 되 돌려 주 고 이 uploader 인 스 턴 스 바 인 딩 이벤트 에 대해 한 걸음 한 걸음 인 자 를 줍 니 다.그러나 분명 한 것 은 내 가 주어진 매개 변 수 는 uploader 인 스 턴 스 를 동시에 되 돌려 주 었 습 니 다.하나의 소스 코드 만 수정 하면 jquery.plplpload.quue.js 소스 코드 를 열 어 정의 plplploproadQueue 라 는 것 을 찾 았 습 니 다.if(settings)내의 return this 를 return uploaders[$(this[0]).attr('id')로 바 꾸 었 습 니 다.이렇게 하면 일시 정지 단 추 를 누 르 면 현재 업로드 가 중단 되 고 시작 단 추 를 누 르 면 계속 됩 니 다.
3:컨트롤 러 맵

  @Autowired
  private PluploadService pluploadService;

  /**Plupload        */
  @RequestMapping(value="/pluploadUpload")
  public void upload(Plupload plupload,HttpServletRequest request,HttpServletResponse response) {

    String FileDir = "pluploadDir";//        
    plupload.setRequest(request);//    Plupload  HttpServletRequest  

    int userId = ((User)request.getSession().getAttribute("user")).getUserId();

    //        ,       ,    Servlet    "pluploadDir"   ,       id   
    File dir = new File(request.getSession().getServletContext().getRealPath("/") + FileDir+"/"+userId);
    if(!dir.exists()){
      dir.mkdirs();//       , mkdir()        
    }
    //      
    pluploadService.upload(plupload, dir);
  }

여기 서 저 는 서로 다른 사용자 가 올 린 자 료 는 유일한 id 에 따라 서로 다른 폴 더 를 분리 하도록 규정 하고 있 습 니 다.주석 코드 를 바탕 으로 쉽게 알 아 볼 수 있 습 니 다.Plupload 와 PluploadService 에 곤 혹 스 러 울 수도 있 습 니 다.다음은 제 시 될 것 입 니 다.
4:Plupload 클래스

package web.plupload;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

/**
 * Plupload       ,       
 *   MultipartFile   Spring web   ,     web      ,          entity  
 */
public class Plupload {
  /**    */
  private String name;
  /**            */
  private int chunks = -1;
  /**    ( 0    )*/
  private int chunk = -1;
  /**HttpServletRequest  ,      ,      */
  private HttpServletRequest request;
  /**        ,      ,      */
  private MultipartFile multipartFile;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getChunks() {
    return chunks;
  }

  public void setChunks(int chunks) {
    this.chunks = chunks;
  }

  public int getChunk() {
    return chunk;
  }

  public void setChunk(int chunk) {
    this.chunk = chunk;
  }

  public HttpServletRequest getRequest() {
    return request;
  }

  public void setRequest(HttpServletRequest request) {
    this.request = request;
  }

  public MultipartFile getMultipartFile() {
    return multipartFile;
  }

  public void setMultipartFile(MultipartFile multipartFile) {
    this.multipartFile = multipartFile;
  }
}

클래스 이름과 속성 명 을 임의로 변경 할 수 없 음 을 다시 한 번 알려 줍 니 다.정 해진 정확 한 속성 명 을 통 해 클 라 이언 트 는 Http 를 통 해 서버 컨트롤 러 에 블록 파일 을 보 내 고 얻 은 plplpload 대상 만 정확 한 파일 정 보 를 전달 할 수 있 습 니 다.
속성 에 대한 설명 코드 주석 은 이미 명확 하 게 말 했 으 니 스스로 연구 하여 공부 할 수 있다.
5:PluploadService 클래스

package web.plupload;

import entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import java.io.*;
import java.sql.Timestamp;
import java.util.Iterator;
import java.util.List;

import service.youandmeService;

/**
 * Plupload Service  , Plupload     ,     Spring web    ,       Service  
 */
@Component  //       SpringIOC    Controller    
public class PluploadService {

  @Autowired
  private youandmeService youandmeService;

  public void upload(Plupload plupload,File pluploadDir){
    String fileName = ""+System.currentTimeMillis()+plupload.getName();//            
    upload(plupload, pluploadDir, fileName);
  }

  private void upload(Plupload plupload,File pluploadDir,String fileName){

    int chunks = plupload.getChunks();//             
    int nowChunk = plupload.getChunk();//   , 0  

    //  Request             ,      SpringIOC    multipartResolver    。
    MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)plupload.getRequest();
    //    map        
    MultiValueMap<String,MultipartFile> map = multipartHttpServletRequest.getMultiFileMap();

    if(map!=null){
      try{
        Iterator<String> iterator = map.keySet().iterator();
        while(iterator.hasNext()){

          String key = iterator.next();
          List<MultipartFile> multipartFileList = map.get(key);

          for(MultipartFile multipartFile:multipartFileList){//       

            plupload.setMultipartFile(multipartFile);//   Plupload    MultipartFile   
            File targetFile = new File(pluploadDir+"/"+fileName);//      ,             
            if(chunks>1){//           1,     

              File tempFile = new File(pluploadDir.getPath()+"/"+multipartFile.getName());
              //         ,       
              savePluploadFile(multipartFile.getInputStream(),tempFile,nowChunk==0?false:true);

              if(chunks-nowChunk==1){//         ,  targetFile          ,      
                tempFile.renameTo(targetFile);

                //        ,          
                Timestamp now = new Timestamp(System.currentTimeMillis());
                youandmeService.uploadInfo(fileName,((User)(plupload.getRequest().getSession().getAttribute("user"))).getUsername(),now);
              }
            }
            else{
              //    ,         
              multipartFile.transferTo(targetFile);

              //        ,          
              Timestamp now = new Timestamp(System.currentTimeMillis());
              youandmeService.uploadInfo(fileName, ((User) (plupload.getRequest().getSession().getAttribute("user"))).getUsername(), now);
            }
          }
        }
      }
      catch (IOException e){
        e.printStackTrace();
      }
    }
  }
  private void savePluploadFile(InputStream inputStream,File tempFile,boolean flag){
    OutputStream outputStream = null;
    try {
      if(flag==false){
        //    
        outputStream = new BufferedOutputStream(new FileOutputStream(tempFile));
      }
      else{
        //     
        outputStream = new BufferedOutputStream(new FileOutputStream(tempFile,true));
      }
      byte[] bytes = new byte[1024];
      int len = 0;
      while ((len = (inputStream.read(bytes)))>0){
        outputStream.write(bytes,0,len);
      }
    }
    catch (FileNotFoundException e){
      e.printStackTrace();
    }
    catch (IOException e){
      e.printStackTrace();
    }
    finally {
      try{
        outputStream.close();
        inputStream.close();
      }
      catch (IOException e){
        e.printStackTrace();
      }
    }
  }
}

1.PluploadService 라 는 이름 은 제 가 지 었 습 니 다.괜 찮 죠~
2.Controller 의 마지막 줄 인 PluploadService.upload(plplplpload,dir);서버 에서 생 성 된 plplpload 대상 과 저 장 된 폴 더 디 렉 터 리 에 클 라 이언 트 를 제출 하여 plplploadService 의 upload 방법 에 매개 변수 로 전송 합 니 다.
3.upload(Plupload plplplplplplpload,File plplploadDir)방법 에서 서버 에 저장 할 수 있 는 유일한 파일 이름 을 만 듭 니 다.
4.chunks 는 사용자 가 업로드 할 파일 중 현재 파일 이 구 분 된 총 블록 을 한꺼번에 선택 합 니 다.nowChunk 는 이번에 올 린 블록의 번호 입 니 다.0 부터 왜'이번'을 사용 합 니까?앞에서 언급 했 듯 이 Plupload 는 클 라 이언 트 에서 서버 로 블록 을 순서대로 제출 하기 때문에 파일 업로드 에 Http 요청 이 여러 번 있 고 같은 파일 의 chunks 는 변 하지 않 으 며 nowChunk 는 한 번 씩 증가 합 니 다.
5.HttpServletRequest 를 Multipart HttpServletRequest 로 강제 변환 하 는 중 오류 가 발생 할 수 있 지만,이 오 류 는 피 할 수 있 습 니 다.SpringIOC 용기 에 multipart Resolver 라 는 대상 을 주입 하면 됩 니 다.

<bean id="multipartResolver"
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- set the max upload size100MB -->
    <property name="maxUploadSize">
      <value>104857600</value>
    </property>
    <property name="maxInMemorySize">
      <value>4096</value>
    </property>
    <property name="defaultEncoding" value="UTF-8"></property>
  </bean>
6.MultipartHttpServletRequest 를 통 해 MultiValueMap 을 가 져 옵 니 다.
7.plupload.setMultipartFile(multipartFile);plploproad 대상 에 수 동 으로 MultipartFile 속성 값 을 전송 합 니 다.
8.총 블록 수 chunks 가 1 보다 크 면 올 라 온 작은 블록 을 하나의 파일 로 합성 하 는 것 을 고려 해 야 합 니 다.그렇지 않 으 면 블록 파일 을 대상 파일 multipart File.transferto(targetFile)로 직접 복사 해 야 합 니 다.
9.chunks 가 1 보다 클 때 먼저 임시 파일 tempfile 을 새로 만들어 서 이 tempfile 에 작은 조각 을 계속 기록 하 는 데 사용 합 니 다.다 쓴 후에(chunks-nowChunk==1)이름 을 바 꿉 니 다(tempfile.renameTo(targetFile).
10.savePluploadFile(multipartFile.getInputStream(),tempFile,nowChunk==0?false:true);방법 은 작은 파일 하 나 를 합 치 는 데 사 용 됩 니 다.첫 번 째 조각 이 라면 처음부터(new FileOutputStream(tempFile)을 기록 합 니 다.그렇지 않 으 면 모두 끝 에서 기록 합 니 다(new FileOutputStream(tempFile,true).
여기까지 썼 습 니 다.Plupload 를 바탕 으로 단점 속전 을 실현 하 는 코드 는 모두 제 시 했 습 니 다.여러분 은 스스로 프로젝트 에 통합 해 야 합 니 다.여 기 는 완전한 demo 를 제시 하지 않 았 습 니 다.음,아니면 그 말 입 니까?물고기 에 게 가 르 치 는 것 보다 물고 기 를 가 르 치 는 것 이 좋 습 니 다.
항목 효과 그림 업로드:
1.업로드 파일 선택:
这里写图片描述
2.업로드 시작,진행 표시 줄 표시:
这里写图片描述
3.업로드 일시 정지:
这里写图片描述
4.일시 정지 후 계속 업로드:
这里写图片描述
5.업로드 완료:
这里写图片描述
6.대상 폴 더 아래 에 해당 하 는 파일 이 있 음:
这里写图片描述
7.업로드 과정 에서 의 네트워크 요청,블록 업로드 구현:
这里写图片描述
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기