diff --git a/script.js b/script.js index 8f7072a..8c2ef32 100644 --- a/script.js +++ b/script.js @@ -525,6 +525,12 @@ class FileManager { const safeFileName = `${Date.now()}_${Math.random().toString(36).substr(2, 9)}${fileExtension}`; const filePath = `${this.currentUser.id}/${fileId}/${safeFileName}`; + // Storage 버킷 확인 + const bucketExists = await SupabaseHelper.checkOrCreateBucket(); + if (!bucketExists) { + throw new Error('Storage 버킷이 설정되지 않았습니다. Supabase Dashboard에서 "files" 버킷을 생성해주세요.'); + } + // Supabase Storage에 업로드 const uploadResult = await SupabaseHelper.uploadFile(blob, filePath); console.log('Storage 업로드 성공:', uploadResult); @@ -588,7 +594,16 @@ class FileManager { } try { + console.log('파일 다운로드 시도:', filePath, originalName); + + // Storage 버킷 확인 + const bucketExists = await SupabaseHelper.checkOrCreateBucket(); + if (!bucketExists) { + throw new Error('Storage 버킷이 설정되지 않았습니다. 관리자에게 문의하세요.'); + } + const url = await SupabaseHelper.getFileUrl(filePath); + console.log('다운로드 URL 생성:', url); // 다운로드 링크 생성 const link = document.createElement('a'); @@ -598,9 +613,20 @@ class FileManager { document.body.appendChild(link); link.click(); document.body.removeChild(link); + + console.log('파일 다운로드 완료:', originalName); } catch (error) { console.error('파일 다운로드 오류:', error); - this.showNotification('파일 다운로드 중 오류가 발생했습니다.', 'error'); + + // 더 구체적인 오류 메시지 제공 + let errorMessage = '파일 다운로드 중 오류가 발생했습니다.'; + if (error.message.includes('Bucket not found')) { + errorMessage = 'Storage 버킷이 설정되지 않았습니다. 관리자에게 문의하세요.'; + } else if (error.message.includes('파일을 찾을 수 없습니다')) { + errorMessage = '파일을 찾을 수 없습니다. 파일이 삭제되었을 수 있습니다.'; + } + + this.showNotification(errorMessage, 'error'); } } diff --git a/supabase-config.js b/supabase-config.js index a1058cf..21061ab 100644 --- a/supabase-config.js +++ b/supabase-config.js @@ -211,11 +211,32 @@ const SupabaseHelper = { async getFileUrl(filePath) { if (!supabase) throw new Error('Supabase가 초기화되지 않았습니다.'); - const { data } = supabase.storage - .from('files') - .getPublicUrl(filePath); + try { + // 먼저 파일이 존재하는지 확인 + const { data: fileExists, error: checkError } = await supabase.storage + .from('files') + .list(filePath.substring(0, filePath.lastIndexOf('/')), { + search: filePath.substring(filePath.lastIndexOf('/') + 1) + }); + + if (checkError) { + throw new Error(`Storage 버킷 오류: ${checkError.message}`); + } - return data.publicUrl; + if (!fileExists || fileExists.length === 0) { + throw new Error('파일을 찾을 수 없습니다.'); + } + + // 파일이 존재하면 URL 생성 + const { data } = supabase.storage + .from('files') + .getPublicUrl(filePath); + + return data.publicUrl; + } catch (error) { + console.error('파일 URL 생성 오류:', error); + throw error; + } }, // 파일 삭제 (Storage) @@ -244,6 +265,36 @@ const SupabaseHelper = { if (error) throw error; return data; + }, + + // Storage 버킷 확인 및 생성 + async checkOrCreateBucket() { + if (!supabase) throw new Error('Supabase가 초기화되지 않았습니다.'); + + try { + // 버킷 목록 확인 + const { data: buckets, error: listError } = await supabase.storage.listBuckets(); + + if (listError) { + console.error('버킷 목록 조회 오류:', listError); + return false; + } + + // 'files' 버킷이 있는지 확인 + const filesBucket = buckets.find(bucket => bucket.name === 'files'); + + if (filesBucket) { + console.log('✅ files 버킷이 존재합니다.'); + return true; + } else { + console.warn('⚠️ files 버킷이 존재하지 않습니다.'); + console.log('Supabase Dashboard에서 files 버킷을 생성해주세요.'); + return false; + } + } catch (error) { + console.error('버킷 확인 오류:', error); + return false; + } } };