![]()
문제의 원인 분석
파일을 저장할 때 겹치는 경로 문제는 일반적으로 두 가지 원인에서 발생합니다. 첫 번째는 OS 경로와 네트워크 경로를 혼동하는 것입니다.
두 번째는 파일명 처리 과정에서 발생하는 오류입니다. 이 두 가지 원인을 알아보는 것이 문제를 해결하는 첫걸음입니다.OS 경로와 네트워크 경로 혼동
OS에서는 파일 경로를 지정할 때 역슬래시(\)를 사용하지만, 웹에서는 슬래시(/)를 사용해야 합니다. 이 점을 간과하면 파일을 찾지 못하는 문제가 발생하게 됩니다.
| 환경 | 파일 경로 예시 |
|---|---|
| 웹 | /images/파일명.jpg |
| Windows | C:\server\images\파일명.jpg |
파일명 처리 오류
파일명을 처리할 때, 사용자가 선택한 파일의 전체 경로가 아닌 파일명만을 추출해야 합니다. 이를 위해 FilenameUtils.getName() 메서드를 사용하여 파일명을 올바르게 추출해야 합니다.
FileNotFoundException이 발생할 수 있습니다. 올바른 파일명 처리 방법은 다음과 같습니다.
java
String fileName = FilenameUtils.getName(item.getName());
해결 과정
이제 문제의 원인을 분석했으니, 이를 해결하기 위한 구체적인 방법을 살펴보겠습니다. 파일을 서버에 저장하고 데이터베이스에 경로를 저장하는 과정을 단계별로 진행하겠습니다.
1단계: 서버 경로 설정
서버 폴더의 경로를 올바르게 설정하는 것이 첫 번째 단계입니다. 이 과정에서는 FileUtil 클래스를 사용하여 서버 폴더의 경로를 확인하고 수정해야 합니다.
java
String serverPath = "C:\\server\\images\\"; // Windows OS에서의 경로
| 설정 항목 | 설명 |
|---|---|
| serverPath | 서버의 이미지 저장 경로 |
| OS 경로 형식 | 역슬래시(\) 사용 |
2단계: 파일명 처리
파일명을 처리하는 과정에서는 FilenameUtils.getName() 메서드를 사용하여 파일명만 추출합니다. 다음은 이를 구현한 코드 예시입니다.
java
FileItem item = (FileItem) itr.next();
String fileName = FilenameUtils.getName(item.getName());
| 설정 항목 | 설명 |
|---|---|
| fileName | 파일의 이름 |
| 처리 방법 | getName() 메서드 사용 |
3단계: 파일 저장
파일을 서버에 저장하는 과정에서는 item.write(savedFile); 메서드를 사용하여 지정된 경로에 파일을 저장합니다. 아래는 파일을 저장하는 코드의 예시입니다.
java
File savedFile = new File(serverPath + fileName);
item.write(savedFile);
| 설정 항목 | 설명 |
|---|---|
| savedFile | 저장할 파일 객체 |
| 저장 메서드 | item.write() 사용 |
4단계: 데이터베이스에 경로 저장
파일이 성공적으로 서버에 저장되었다면, 이제 데이터베이스에 파일 경로를 저장해야 합니다. 이 과정에서는 INSERT 쿼리를 사용하여 파일 경로를 저장합니다.
java
String sql = "INSERT INTO images (file_path) VALUES (?)";
| 설정 항목 | 설명 |
|---|---|
| sql | 파일 경로를 저장할 쿼리 |
| DB 테이블 | images |
5단계: 이미지 출력
마지막으로, 데이터베이스에서 저장한 경로를 불러와서 이미지를 출력하는 과정입니다. 이때 <img> 태그의 src 속성에 올바른 경로를 설정해야 합니다.
/)를 사용해야 합니다.
html
<img src="/프로젝트명/images/파일명" alt="이미지 설명">
| 설정 항목 | 설명 |
|---|---|
| src | 이미지 파일 경로 |
| HTML 태그 | <img> 사용 |
결론
위의 과정을 통해 FileNotFoundException 문제를 해결할 수 있습니다. 개발 과정에서 파일 경로와 파일명을 정확히 처리하는 것이 얼마나 중요한지를 다시 한 번 느낄 수 있었습니다.