티스토리 뷰

 파일을 다운로드 할 때 로딩 바가 보이지 않으면 사용자도 이게 작동하는지 안 하는지 알 수 없기 때문에 여러 번 버튼을 누르게 되고 이 때문에 서버에 악 영향을 줄 수 있습니다. 제가 지금 유지 보수하고 있는 곳이 그렇게 되어 있어서 이번 기회에 파일 다운로드 시 로딩 바가 나올 수 있도록 구현하고자 마음 먹었습니다. ajax를 이용하거나 iframe을 이용하는 등의 방법이 있지만 ajax로 통신할 경우 200 Error가 나고 iframe으로 하려 해도 onload 함수를 이용해서 구현해야 하는데 화면이 reset되는 것이 아니어서 둘 다 되지 않았습니다. 그래서 좀 더 찾아보니 Cookie를 이용해서 구현한 로딩 바가 있었습니다.

 - JAVA 단

1
2
3
4
5
6
7
8
9
10
11
12
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 중략..
 * 화면으로 돌아가기 전에 쿠키를 생성
 * 파일이 만들어지고 나서 실행해야 속도 맞추기가 더 쉬움 
 **/
 
 
Cookie cookie = new Cookie("fileDownloadToken""TRUE");
response.addCookie(cookie);
cs

- Javascript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<div id="loadingBar" style="display:none;">
    <img src="/images/loadingBar.gif"/>
</div>
 
<script type="text/javascript">
 
function getCookie(name) {
  var parts = document.cookie.split(name + "=");
  if (parts.length == 2return parts.pop().split(";").shift();
}
 
function expireCookie(name) {
    document.cookie = encodeURIComponent(name+ "=deleted; expires=" + new Date0 ).toUTCString();
}
 
var downloadTimer;
 
//파일 다운로드를 submit할 때 아래 함수 실행
function blockUI() {
    $("#loadingBar").show();
    downloadTimer = setInterval(function() {
        var token = getCookie("fileDownloadToken");
        if(token == "TRUE") {
            unBlockUI();
        }
    }, 1000 );
}
 
function unBlockUI() {
    $("#loadingBar").hide();
    clearInterval(downloadTimer);
}
 
</script>
 
cs


 JAVA단에서 Cookie를 생성한 후에 화면으로 던져주고 로딩 바가 나오게 한 후 주기적으로 Cookie를 검사해서 JAVA단에서 보낸 값과 동일한 값이 나오면 다시 로딩 바를 숨기고 Interval을 그만두게 하는 로직입니다. 좀 더 응용하면 파일이 만들어질 때나 파일을 화면으로 던질 때 Cookie를 생성해서 공통으로 사용하게 하거나 Cookie가 아니라 Session에 값을 넣고 사용할 수도 있을 것 같습니다. 아래 링크 두 개를 혼합하여 만들었습니다.


1. https://stackoverflow.com/questions/1106377/detect-when-browser-receives-file-download
2. http://goni9071.tistory.com/entry/%EC%9B%B9-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday