솔티독
80
2021-08-03 11:10:53 작성 2021-08-03 11:16:01 수정됨
5
108

서버에서 클라이언트로 다운로드 질문


서버에 파일이 있고 클라이언트에서 다운로드를 하려고 합니다.

밑의 소스코드를 이용하였는데 로컬에선 잘 돌아가는데 서버에 war로 배포만 하면 계속 jsp에서 ajax 부분에서 error로 빠집니다.

코드도 간단한데 왜 ajax에서 넘어가질 못하나요?



<html>
<head>
	<title>Home</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>	<!-- jquery -->
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>	<!-- jquery ui -->
</head>
<body>
<input id="btn" type="button" value="다운로드">

<script>
$('#btn').on('click', function() {
	$.ajax({
		url: "download.do",
		data: {
		},
		type: "POST",
		success : null,
		error : function(request, error){
			alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error)
		}
	});
});
</script>
</body>
</html>


@ResponseBody
	@RequestMapping("download.do")
	public void download(Locale locale, Model model, HttpServletRequest request, HttpServletResponse response) {
		String spec = "http://서버주소:포트번호/video/20210730/202107301750_1800.mp4";
		String outputDir = "C:/output";
		
		URI url = URI.create(spec);
		
		RestTemplate rt = new RestTemplate();
		ResponseEntity<byte[]> res = rt.getForEntity(url, byte[].class);
		byte[] buffer = res.getBody();
		
		try {
			String originFileName = URLDecoder.decode(spec, "UTF-8");
			String onlyFileName = originFileName.substring(originFileName.lastIndexOf("/") + 1);

			Path target = Paths.get(outputDir, onlyFileName);

			FileCopyUtils.copy(buffer, target.toFile());
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

그리고 지금 저장되는 경로를 C 드라이브의 output 폴더로 했는데(클라이언트에 이미 그 폴더가 있다고 가정) 이러면 클라이언트에 저장이 되나요 아니면 서버의 output 폴더에 저장이 되나요?


+ 오류 로그가 긁는게 안 되어 사진 첨부합니다..





0
  • 답변 5

  • devprkms
    567
    2021-08-03 11:14:31

    error 빠지면서 출력되는 alert의 내용은요 ?



  • 솔티독
    80
    2021-08-03 11:16:35

    죄송합니다 깜빡했네요 방금 추가하였습니다

  • 안전라이딩
    1k
    2021-08-03 11:21:03

    파일을 좀 쪼개서 전송하고 받게 해보시죠..

  • HJOW
    4k
    2021-08-03 14:32:49 작성 2021-08-03 14:33:10 수정됨

    java.lang.OutOfMemoryError Java heap 이 부분이 보이네요.

    메모리 오버됐습니다.


    파일 내용 전체를 읽어서 변수에 담아두지 말고

    일부 읽고 바로 일부를 보내버리고 다음 일부를 읽고...

    이런식으로 구현해보세요.

  • 솔티독
    80
    2021-08-03 15:30:41

    댓글들 보고 찾아보고 적용해보고 했는데 제가 아직 잘 모르겠어서...


    	@ResponseBody
    	@RequestMapping("download.do")
    	public void download(Locale locale, Model model, HttpServletRequest request, HttpServletResponse response) {
    		String spec = "http://서버주소:포트번호/video/20210730/202107301750_1800.mp4";
    		String outputDir = "C:/output";
    		
    		URI url = URI.create(spec);
    		
    		RestTemplate rt = new RestTemplate();
    		ResponseEntity<byte[]> res = rt.getForEntity(url, byte[].class);
    		byte[] buffer = new byte[1024];
    		buffer = res.getBody();
    		
    		try {
    			String originFileName = URLDecoder.decode(spec, "UTF-8");
    			String onlyFileName = originFileName.substring(originFileName.lastIndexOf("/") + 1);
    
    			Path target = Paths.get(outputDir, onlyFileName);
    
    			FileCopyUtils.copy(buffer, target.toFile());
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    	}

    byte[] buffer = new byte[1024]; 이렇게하면 1024씩 끊어서 보내는게 아닌가요...?

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