Development/Daily Error

일간에러 2021-12-21 파일 업로드시 파일명 깨짐

📝 작성 : 2021.12.21  ⏱ 수정 : 
반응형

오류

파일 업로드&다운로드 처리를 위한 모듈을 중간에 연결해 파일 업로드를 구현하던 중.

파일명이 영문이나 심지어 일본어로 되어 있어도 정상적으로 업로드 처리가 되었는데, 한글만 있으면 파일명이 깨지는 문제가 발생했다.

image-20211221131253073

단순히 파일명만 깨지는 선에서 끝난다면 파일 명을 어딘가 기록 해 두고 어떻게든 우회하는 방법으로 처리 할 수 있겠지만, 문제는 위에 보이는 것 처럼 _start_offset 과 _end_offset을 기록하며 innorix 모듈이 파일을 쪼개서 전송하는 것 이었다.

파일 업로드가 한 요청으로 끝나는게 아니고 클라이언트 쪽에 설치된 이로릭스 클라이언트를 통해

브라우저 -> innorix(port:4033) -> 서버 

과정으로 요청이 여러개로 쪼개져 전달되며 업로드 상태도 계속해서 업데이트가 되는데, 첫 요청시에는 파일명이 한글파일.jsp 라는 이름으로 전달 되지만 두번째 요청부터 바로 파일명이 깨져버리는 문제가 있었다.

image-20211221131420397

그러다보니 한글이름.jsp 파일 하나를 업로드 하는데 위와 같이 ????. jsp와 한글이름.jsp 두개의 파일로 나뉘어 버리는 문제가 발생.

image-20211221132255974

한글이름.jsp 파일은 겉보기에는 멀쩡 해 보이지만, Type도 Binary로 되어 있으며 파일을 제대로 읽을 수가 없다.

원인

테스트를 위해 외장 톰캣 서버를 띄우고 파일 업로드 모듈만 딸랑 넣어서 작동시켰을 때에는 문제가 없었다.

요청을 보낼 때 Payload를 하나하나 확인 해 보니 문제가 있을때와 정상적으로 동작 할 때의 요청이 정확히 일치했다.

그래서 이번에는 아에, 모든 처리를 진행중인 프로젝트에서 전부 다 하며 심지어 파일 업로드 하는 폼도 지금의 프로젝트에서 띄우게 하고, 오직 파일을 받아 처리하는 부분만 외장 톰캣을 따로 하나 띄워 그거만 처리하게끔 해 보았다. 그랬더니 이번에는 파일 업로드가 한글 파일이 깨지지도 않으며 정상적으로 잘 동작 했다.

파일 업로드와 다운로드 처리하는 코드는 정확히 동일하며, 단지 차이는 예제 코드에서는 jsp 파일이 업로드를 처리 했지만 프로젝트에서는 컨트롤러가 요청을 받아 같은 내용의 처리를 했다는 것.

용의선상에서 모든 무죄 요소들을 석방 해주고 나니, 컨트롤러가 요청을 받는 순간에 문제가 있음이 확실해졌다. 이제 컨트롤러가 요청을 받을 때 해당 요청의 인코딩을 고쳐주면 되는데..

지금 상황은 요청을 브라우저가 직접 보내는 게 아니고, 클라이언트 측에 설치된 innorix 프로그램이 보낸다. 그말은 요청도 무죄.

서버의 여러번의 응답중 처음 응답에서 이미 파일명이 깨져버린 것이다.

해결

크게 두가지 방법이 있다. 왠만하면 어노테이션에 produces = "text/plain;charset=UTF-8" 를 달면 해결 될 테지만, response가 직접 응답을 하는 내 경우에는 소용이 없었다.

1. response의 charset 변경

컨트롤러에서 응답을 보내기 전에 Charset을 직접 지정해준다.

response.setCharacterEncoding("UTF-8");

2. application.yml에 강제 설정

SpringBoot를 사용한다면 application.yml에 아래의 내용을 추가 해준다.

application.properties 파일을 사용하면 spring.http.encoding.charset=UTF-8 이런식으로 세줄 작성 해 주면 되겠다.

spring.http:
  encoding:
    charset: UTF-8
    enabled: true
    force: true

프로젝트가 기본적으로 UTF-8로 개발하고는 있지만 force 옵션을 주지 않으면 작동 하지 않았다.

force만 아니어도 덜 찝찝할텐데 어디까지 사이드 이펙트가 생길지 확실하지 않아 일단 첫번째 방법으로 문제를 해결 하였다.

반응형