GET 방식으로 파일을 다운로드를 하다보니 크롬에서는 괜찮지만, IE에서는 문제가 발생한다.


 "서버를 찾을 수 없습니다" 라던가 " 이 페이지는 존재 하지않습니다" 라던가 등등의 문제가 발생한다.


 이유는 간단한데, GET방식의 글자 제한으로 인한 문제이다..

 글자를 줄일수 있다면야 계속 사용하겠지만, 그건 안되고 ㅜㅜ 


 그래서 GET을 POST 방식으로 바꾸기로했다.

 (사실 말이 POST방식이지 GET을 사용하여 다운로드를 한다.)


 그래도 혹시 모르니 GET, POST 방식 모두 올려 놓도록 하겠다.


 GET 방식

 view 단


location.href = url + '/filedownload?' + encodeURI(me.form.serialize() , "UTF-8");


location.href 을 사용하면 get 방식으로 사용이 된다고 함.

encodeURI( 포맷, "포맷방식") 을 사용하여 한글 깨짐이 없도록 한다.



Controller 단

    @RequestMapping(value = "/filedownload", method = RequestMethod.GET)

    public ModelAndView getFile(@RequestParam ... ) throws Exception {


        String fileNm = "파일명";

        

        String path = "파일의 경로"


        if(path == null){

        return null;

        }

        File file = new File(path);


        param.put("file", file);

        param.put("fileName", fileNm);

        param.put("contentType", "application/download;charset=UTF-8");


        return new ModelAndView("downloadView", param);

    }



POST 방식


view단

            $.ajax({

                   url: url + '/filedownload',

                   method: 'POST',

                   loadingTarget: true,

                   data: me.form.serialize(),

                   dataType: 'json',

                   success: function(data) {

                     if (data.header.success) {

                         if(!data.body)

                             return;

                         var path = 'path=' + data.body;

                         location.href = url + '/filedownload?' +  encodeURI(path , "UTF-8");

                       }

                   }

               });


Controller 단


    @RequestMapping(value = "/filedownload", method = RequestMethod.POST)

    @ResponseBody

    public Result getFile(@RequestParam ... ) throws Exception {


        String fileNm = "파일명";

        String path = "파일의 경로"


        path = URLEncoder.encode(path, "UTF-8");


        return new Result(true, "0000", (Object) path);

    }

    

    

    @RequestMapping(value = "/filedownload", method = RequestMethod.GET)

    public ModelAndView getFile(@RequestParam ... ) throws Exception {

        

        String path = (String) param.get("path");    // 위에서 보냈던 경로가 들어옴

        

        if(path == null){

        return null;

        }

        

        path = URLDecoder.decode(path, "UTF-8");

        String fileNm = "파일명";

        

        File file = new File(path);


        param.put("file", file);

        param.put("fileName", fileNm);

        param.put("contentType", "application/download;charset=UTF-8");


        return new ModelAndView("downloadView", param);

    }


ajax로 post 방식으로 값을 먼저 보낸 후,

파일 경로를 받아 get으로 다운을 하면 된다.



 개발을 하다보면 서버로의 요청을 할 때 주로 get과 post 방식을 많이 쓰게 된다.

 그래서 이게 뭔가 다시 단어를 재 정립 해보았다.


 GET 방식

  - 주소(URL) 뒤에 데이터의 값이 붙는다.

ex) aaa.com?search=abc&page=2 

> ?뒤에 전송값이 붙어서 가게된다.

  - 보안에 취약하다

  - 길이에 제한이 있다.(= 전송의 한계)

  - POST방식보다 빠르다


 POST 방식

  - form을 이용해 action이 취해진다.

  - GET 방식보다 보안성이 높다.

  - 크기의 제한이 없다.

  - GET방식보다 느리다.


 간단하게 둘의 차이를 정의하자면


  GET은 가져오는 것이고 POST는 수행하는 것.


 즉, 단어의 뜻 그대로 get은 웹 서버에서 데이터를 가지고 올때,

 post 브라우저에서 서버로 데이터를 보낼 때, 주로 사용이 된다고 보면 될것이다.


 ==================================


 p.s)  GET에 글자의 제한이 있다고 했지만,

 크롬같은 브라우저에는 제한이 없고, IE같은 경우에는 글자수에 제한이 남아있다.

 



'IT > 기타' 카테고리의 다른 글

엑셀 사진 저장하는 방법  (0) 2019.01.04

+ Recent posts