[jQuery] blueimp 파일 업로드 플러그인

참고 문서

required

  • jQuery 1.6 or higher
  • jQuery UI widget factory 1.9 or higher
  • jQuery Iframe Transport plugin

지원하는 브라우저

request example

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sample</title>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script src="../lib/jquery.fileupload.js"></script>
<script >
  $(document).ready(function() {
    $('#upFile').fileupload({
      url : '/bo/sample/file/uploadProcess.do',
      dataType: 'json',
      //replaceFileInput: false,
      add: function(e, data){
        var uploadFile = data.files[0];
        var isValid = true;
        if (!(/png|jpe?g|gif/i).test(uploadFile.name)) {
          alert('png, jpg, gif 만 가능합니다');
          isValid = false;
        } else if (uploadFile.size > 5000000) { // 5mb
          alert('파일 용량은 5메가를 초과할 수 없습니다.');
          isValid = false;
        }
        if (isValid) {
          data.submit();
        }
      }, progressall: function(e,data) {
        var progress = parseInt(data.loaded / data.total * 100, 10);
        $('#progress .bar').css(
          'width',
          progress + '%'
        );
      }, done: function (e, data) {
        var code = data.result.code;
        var msg = data.result.msg;
        if(code == '1') {
          alert(msg);
        } else {
          alert(code + ' : ' + msg);
        }
      }, fail: function(e, data){
        // data.errorThrown
        // data.textStatus;
        // data.jqXHR;
        alert('서버와 통신 중 문제가 발생했습니다');
        foo = data;
      }
    });
  });
</script>
</head>
<body>
<input type="file" name="fileData" id="upFile">
    <div id="progress">
        <div class="bar" style="width: 0%;"></div>
    </div>
</body>
</html>

파일이 선택될 경우 즉시 업로드하며 서버가 업로드 완료 후 서버에서 전달한 데이터를 표시한다.

Options

  • dataType: 서버에서 응답받을 데이터의 타입. (xml, json, script, or html)
  • replaceFileInput: 기본값은 true, 파일이 첨부되면 이벤트 핸들링 시점에서 파일입력폼을 클론으로 대체한다. 이 값이 false면 fileUpload 이벤트 후에도 파일입력폼의 첨부파일이 사라지지 않는다. 만약 fileUpload 플러그인을 업로드 용도가 아닌 파일의 유효성 검사를 체크하기 위해서 사용한다면 이 옵션을 false로 하여 사용한다.

life cycle은 add - progress - done or fail

add에서 submission하지 않으면 데이터 전송이 이뤄지지 않으니 주의할 것. 이를 이용하여 validation만 적용하는 꼼수가 있다.

response example

@RequestMapping(value="/sample/file/upload", produces="application/json")
@ResponseBody
public String upload(HttpServletRequest req) throws IOException {

    // ... 생략

    return "{\"code\":\"1\", \"msg\":\"file upload success.\"}";
}

파일첨부 시 즉시 검증

FileUpload plugin을 사용하면 파일첨부 시점에 add 메서드가 실행되는 점을 이용하여 첨부된 파일의 검증만을 수행한다.

$(document).ready(function() {
  $('#upFile').fileupload({
    url : '/sample/file/uploadProcessJson.action',
    dataType: 'json',
    replaceFileInput: false,
    add: function(e, data){
      var isValid = true;
      var uploadFile = data.files[0];
      if (!(/png|jpe?g|gif/i).test(uploadFile.name)) {
        alert('png, jpg, gif 만 가능합니다');
        isValid = false;
      } else if (uploadFile.size > 5000000) { // 5mb
        alert('파일 용량은 5메가를 초과할 수 없습니다.');
        isValid = false;
      }

      if (!isValid) {
        // 후처리
      {
    }
  });
});