[에러] java.io.FileNotFoundException: C:\Users\user\AppData\Local\Temp\tomcat-docbase.8080.16768757109457259434\upload\ae711ba2-12a4-4cad-9f3f-c6a861846112.mp3 (지정된 경로를 찾을 수 없습니다)

2023. 9. 13. 03:13에러 창고

728x90
SMALL

[Reason]

1. 업로드 경로 추출 및 업로드 인터페이스 호출
2. 인터페이스 내에 전달받은 업로드 경로를 transferTo 함수를 통해 업로드 전달
발생된 에러

위와 같이 MP3 파일을 넣어서 getRealPath 를 통해 실제 업로드될 경로를 추출하고 multipartfile 에서 지원하는 transferTo 함수를 통해 경로로 파일을 보내게끔 만들어 주었는데 지정된 경로를 찾을 수 없다는 에러가 발생하였다.

 

C:\Users\user\AppData\Local\Temp\tomcat-docbase.8080.16768757109457259434\upload\ae711ba2-12a4-4cad-9f3f-c6a861846112.mp3 

 

내가 예상했던대로라면 프로젝트 내부 경로 (C:\MyProject\MusicIsMyLife\MusicIsMyLife\src\main\webapp\upload-music) 가 지정되야 했는데 위의 톰캣 temp 폴더 경로로 잡혀서 에러가 났다.

 

원인을 검색해보니 Spring boot 는 내부의 tomcat 서버를 운영하고 있는데, 따라서 내부의 temp 폴더 tomcat 경로가 고정되어 있다고 한다.

즉, 업로드 경로가 옳바르게 추출되지 않아서 발생된 에러라고 볼 수 있다.

 

 

[Solution]

시도 방법 1)

getRealPath 를 사용할 때 Thymeleaf를 사용하고 있다면 상위 경로에 webapp 폴더가 존재하지 않다면 이와 같은 에러가 발생한다고 한다.

따라서, resources 경로가 있는 곳에 webapp 폴더가 없다면 만들어주고 실제 업로드할 폴더 경로가 추가적으로 존재한다면 만들어주어야 정상적으로 getRealPath 가 정상적으로 원하는 경로로 지정된다고 한다.

하지만 이는 Thymeleaf 를 사용할 경우에만 해당되는 해결 방법인 것인지 위의 이미지와 같이 원하는 경로를 만들어 주었음에도 동일한 에러가 발생하였다.

따라서, 이 해결책은 안되는 것으로 판단했다.

 

시도 방법 2)

지정된 경로가 원하는 경로로 추출되지 않는다면 내가 원하는 경로를 직접 다이렉트로 만들어주어 운영하면 되지 않을까 싶었다.

따라서, 기존에 getRealPath 함수를 사용하여 지정된 경로를 추출하는 것이 아니라 나만의 업로드 경로를 File.separator 와 함께 만들어주어 인터페이스에 적용하였다.

 

업로드 api를 실행했을 때 정상적으로 결과값을 확인할 수 있었다.

 

또한 원하는 경로에 파일이 정상적으로 들어가는 것을 확인할 수 있었다.

 

 

!! 배포 환경 시 해결

+ 위의 해결 방법은 로컬 환경 기준으로 작성된 것이라 C드라이브에 저장된 프로젝트 내부 경로를 잡아주어 성공할 수 있었지만, 만약 서버에 배포하고 서버에 파일들을 업로드하게 될 경우라면 C드라이브 경로를 직접적으로 잡아주는 것이 아니라 해당 서버의 주소로 바꿔서 잡아주어야 한다.

728x90
반응형
LIST