1. 오류 발생
다음은 이미지 업로드 시 발생한 오류 메시지입니다:
이미지 업로드 오류:
{statusCode: '400', error: 'InvalidKey', message: 'Invalid key: public/1732276487299_따꼼_단체사진1.png'}
이미지 업로드 오류:
{statusCode: '400', error: 'InvalidKey', message: 'Invalid key: public/1732275371312_Screenshot 2024-11-20 at 10.10.32 AM.png'}
2. 문제 원인
1. 파일 경로에 공백이나 특수문자 포함: 파일 이름에 공백이나 특수문자가 포함되어 있어 업로드 경로가 잘못 처리될 수 있습니다. 파일 이름을 URL-safe 형식으로 인코딩하거나, 공백을 제거하는 방법을 사용할 수 있습니다.
2. 한글 문자: 일부 파일 저장소 시스템은 한글을 포함한 파일 이름을 처리하지 못할 수 있습니다.
이로 인해, 이미지 업로드가 실패하고 InvalidKey 오류가 발생한 것입니다.
3. 해결 방법
이 문제를 해결하기 위해서는 파일 이름을 안전한 형식으로 변환해야 합니다. 아래와 같은 방법으로 한글 문자, 공백 및 특수문자를 처리할 수 있습니다.
- 파일 이름에서 공백을 제거하고, 특수문자를 안전하게 변환하기:
- 공백을 _로 대체
- 한글 및 특수문자를 _로 변환
- 알파벳, 숫자, 밑줄, 점, 하이픈 외의 문자 제거
4. 코드 수정
수정 전 코드
// 이미지 업로드 함수
const uploadImage = async (file: File): Promise<string | null> => {
const fileName = `public/${Date.now()}_${file.name}`;
const { error } = await browserClient.storage.from("profiles").upload(fileName, file, {
cacheControl: "3600", // 1시간 동안 캐시 유지
upsert: true // 기존 파일이 있으면 덮어씌움
});
if (error) {
console.error("이미지 업로드 오류:", error); // 업로드 오류 처리
return null;
}
const { data: publicUrlData } = browserClient.storage.from("profiles").getPublicUrl(fileName);
return publicUrlData?.publicUrl ?? null; // 이미지 URL 반환
};
문제 코드 수정
const fileName = `public/${Date.now()}_${file.name
.replace(/\s+/g, '_') // 공백을 밑줄(_)로 대체
.replace(/[^\x00-\x7F]/g, '_') // 한글 및 특수문자를 밑줄(_)로 대체
.replace(/[^\w.-]/g, '')}`; // 알파벳, 숫자, 밑줄(_), 점(.), 하이픈(-) 외의 문자는 제거
코드 설명
- 공백을 밑줄(_)로 대체: replace(/\s+/g, '_')는 파일 이름에 있는 모든 공백을 _로 변환합니다. 이렇게 하면 경로에 공백이 포함되지 않도록 처리할 수 있습니다.
- 한글 및 특수문자 처리: replace(/[^\x00-\x7F]/g, '_')는 한글과 기타 특수문자를 _로 변환합니다. 이는 URL-safe한 형식으로 변환하여, 파일 시스템에서 처리할 수 있게 합니다.
- 안전한 문자만 남기기: replace(/[^\w.-]/g, '')는 알파벳, 숫자, 밑줄(_), 점(.), 하이픈(-) 외의 문자를 제거합니다. 이를 통해, 안전한 파일 이름만 남게 됩니다.
예시
파일 이름이 따꼼_단체사진1.png라면, 위의 코드를 적용한 후에는 파일 이름이 1732276487299_따꼼_단체사진1.png와 같이 변환됩니다. 이렇게 변환된 파일 이름은 경로에서 문제가 발생하지 않도록 안전하게 처리됩니다.
배운 점
이번 문제를 해결하면서 여러 가지 중요한 교훈을 얻었습니다:
- 파일 이름의 안전성: 파일 경로와 URL에서 문제가 발생할 수 있는 문자들—특히 한글, 공백, 특수문자—을 안전하게 처리하는 방법을 배웠습니다. 이는 파일 업로드 시 발생할 수 있는 다양한 오류를 예방할 수 있는 중요한 기술입니다.
- 문자열 처리의 중요성: 문자열을 변환하거나 필터링하는 작업에서 정규 표현식을 사용하여 특정 문자를 대체하거나 제거하는 방법을 배웠습니다. 이를 통해 다양한 종류의 오류를 예방할 수 있습니다.
- 문제 해결의 과정: 문제의 원인을 분석하고, 이를 해결할 수 있는 방법을 찾아가는 과정에서 체계적인 접근의 중요성을 다시 한 번 느꼈습니다. 단순히 오류 메시지를 보고 해결책을 찾아가는 것보다, 문제의 근본 원인을 이해하고 해결책을 도입하는 것이 더 효과적이라는 점을 깨달았습니다.
'🚀 프로젝트 > 따꼼' 카테고리의 다른 글
| 최종프로젝트 그 후, 그리고 다시 시작하는 리팩토링 (0) | 2025.03.14 |
|---|---|
| 따꼼 | 날짜선택 Form을 Shadcn의 Date Picker로 교체 구현 및 관련 오류 해결 (1) | 2024.11.26 |
| 따꼼 트러블 슈팅 | React + Supabase 중복 데이터 삽입 문제 해결하기 (0) | 2024.11.20 |
| 따꼼 트러블 슈팅 | 아이카드에서 기본 프로필 이미지 오류 해결 과정 (0) | 2024.11.19 |
| 따꼼 트러블 슈팅 | 아이 등록하기 2단계 페이지: 이전 버튼 문제 해결 과정 (0) | 2024.11.18 |