솔티독
80
2021-08-03 16:43:59
2
152

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


아까 질문 올려서 뭐가 문제인지도 어떻게 해결해야하는지도 알아냈는데 해결하는데 계속 애를 먹고있어서 다시 질문 올립니다..


@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();
		}
	}

OOM 오류로 파일 내용을 끊어서 보내려고 계속 시도중입니다.

여기서 질문이 byte[] buffer = new byte[1024] 이렇게 하면 1024 바이트씩 끊어서 담아져야 하는거 아닌가요?

buffer.length를 콘솔에 찍어보니 그냥 파일 전체 용량이 나오더라구요.

1024 바이트씩 나눠서 보내려면 어떻게 해야하는지 조언 다시 한 번 부탁드립니다..

0
  • 답변 2

  • HJOW
    4k
    2021-08-03 16:51:35 작성 2021-08-03 16:53:56 수정됨
    byte[] buffer = new byte[1024];
    buffer = res.getBody();


    자. 첫번째 줄에서 님은 분명 1024바이트의 배열을 생성해 buffer 라는 변수에 담았습니다.

    그리고, res.getBody() 를 한 결과값을 또 buffer 에 담았습니다. 당연히 저 1024바이트의 배열은 의미없이 사라졌겠죠?




    일단 저 res.getBody() 의 결과물이 얼마나 큰 놈인지 확인해야 할 것 같네요. 왠지 저 mp4 파일 전체 데이터를 다 가져와서 반환하는 놈 같은데...

    만약 이게 맞으면 RestTemplete 와 ResponseEntity를 사용하지 말고 직접 스트림 열어서 가져와야 합니다.

  • 솔티독
    80
    2021-08-03 17:09:26

    감사합니다. 결국 직접 열어야하는군요..

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