큐브개발자
70
2019-07-08 18:51:18
6
1166

엑셀파일 다운로드시 크롬에서 이상한 페이지로 넘어갑니다.


컴퓨터에 저장되어있는 엑셀 양식을 다운로드 받고싶은데요.

익스플로러에서는 다운로드가 잘 됩니다만

크롬에서는 페이지가 넘어가면서

ÐÏࡱá>þÿ þÿÿÿþÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ T8ÍÉÀá°Áâ\pubist B°aÀ

이런식의 이상한 문자들이 나옵니다.

발견되는 오류도 없구요.

해결방안이 궁금합니다.


0
  • 답변 6

  • 멘탈조각
    1k
    2019-07-08 20:02:35

    postman같은 rest client로 파일 주소 콜했을때 헤더에 뭐가 들어있나 확인해 보세요
    특히

    Content-Type이 application/vnd.ms-excel 나 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet인지,

    Content-Disposition에 attachment;가 붙어있는지요.

  • 큐브개발자
    70
    2019-07-09 09:51:50

    멘탈조각님 정말 감사합니다!! 

    크롬에서 다운로드 버튼 눌렀을 시에 페이지 바로 넘어가는 현상 해결했습니다.

    다만 한 가지 또 궁금한 것이

    response.setHeader("Content-Disposition:", "attachment; filename=" + orgFileName + ";");

    여기서 orgFileName이 양식.xls로 나오는 것을 확인했는데,

    막상 다운로드 버튼을 누르니 저장이름이 *****.do 로 나오네요.

    역시 익스플로러에서는 양식.xls로 제대로 나오구요.

    어떤 소스를 수정을 해줘야할까요?

    현재 구현되어있는 소스는 아래와 같습니다.

    초보 개발자라 모르는게 많습니다ㅠ 조언부탁드립니다.

     public void downFile(HttpServletResponse response, String streFileNm, String orignFileNm) throws Exception {
    		String downFileName = streFileNm;
    		String orgFileName = orignFileNm;
    	
    		File file = new File(downFileName);
    		//log.debug(this.getClass().getName()+" downFile downFileName "+downFileName);
    		//log.debug(this.getClass().getName()+" downFile orgFileName "+orgFileName);
    	
    		if (!file.exists()) {
    		    throw new FileNotFoundException(downFileName);
    		}
    	
    		if (!file.isFile()) {
    		    throw new FileNotFoundException(downFileName);
    		}
    	
    		//byte[] b = new byte[BUFF_SIZE]; //buffer size 2K.
    		int fSize = (int)file.length();
    		if (fSize > 0) {
    		    BufferedInputStream in = null;
    	
    		    try {
    			in = new BufferedInputStream(new FileInputStream(file));
    	
    	    	//String mimetype = "text/html"; //"application/x-msdownload"
    	    	response.setBufferSize(fSize);
    			response.setContentType("application/vnd.ms-excel");
    			response.setHeader("Content-Disposition:", "attachment; filename=" + orgFileName + ";");
    			response.setContentLength(fSize);
    			//response.setHeader("Content-Transfer-Encoding","binary");
    			//response.setHeader("Pragma","no-cache");
    			//response.setHeader("Expires","0");
    			FileCopyUtils.copy(in, response.getOutputStream());
    		    } finally {
    			if (in != null) {
    			    try {
    				in.close();
    			    } catch (Exception ignore) {
    				
    				Logger.getLogger(EgovFileMngUtil.class).debug("IGNORED: " + ignore.getMessage());
    			    }
    			}
    		    }
    		    response.getOutputStream().flush();
    		    response.getOutputStream().close();
    		}
        }


  • 스우
    148
    2019-07-09 10:58:30

    response.setHeader("Content-Disposition:", "attachment; filename=" + orgFileName + ";");

    여기서 Content-Disposition 뒤의 :을 빼도 같은 오류가 발생하나요?

  • 큐브개발자
    70
    2019-07-09 15:34:37


    if (header.contains("MSIE") || header.contains("Trident")) {
    			       String docName = URLEncoder.encode(orgFileName,"UTF-8").replaceAll("\\+", "%20");
    			       response.setHeader("Content-Disposition", "attachment;filename=" + docName + ";");
    			} else if (header.contains("Firefox")) {
    			       String docName = new String(orgFileName.getBytes("UTF-8"), "ISO-8859-1");
    			       response.setHeader("Content-Disposition", "attachment; filename=\"" + docName + "\"");
    			} else if (header.contains("Opera")) {
    			       String docName = new String(orgFileName.getBytes("UTF-8"), "ISO-8859-1");
    			       response.setHeader("Content-Disposition", "attachment; filename=\"" + docName + "\"");
    			} else if (header.contains("Chrome")) {
    			       String docName = new String(orgFileName.getBytes("UTF-8"), "ISO-8859-1");
    			       response.setHeader("Content-Disposition", "attachment; filename=\"" + docName + "\"");
    			}
    
    			response.setBufferSize(fSize);
    			response.setHeader("Content-Type", "application/vnd.ms-excel");			
    			response.setHeader("Content-Transfer-Encoding", "binary;");
    			response.setContentLength(fSize);
    			response.setHeader("Pragma", "no-cache;");
    			response.setHeader("Expires", "-1;");

    브라우저별로 설정이 다 달라서

    이렇게 코딩해서 해결했습니다 ㅠ

  • 멘탈조각
    1k
    2019-07-09 15:38:34

    ????

    If trident else면 될건데요...

    저렇게 코드쓰면 혼나요

  • 큐브개발자
    70
    2019-07-09 15:42:16

    네 ㅎㅎ 이것저것 손보면서 하느라 좀 지저분해졌네요 ㅠ

    다시 정리해야죠!

  • 로그인을 하시면 답변 을 등록할 수 있습니다.