/** * 파일 다운로드 유틸리티 * * 백엔드 API: GET /api/v1/files/{id}/download * 프록시: GET /api/proxy/files/{id}/download */ import { downloadBlob } from './export'; /** * Content-Disposition 헤더에서 파일명 추출 */ function extractFilenameFromHeader(response: Response): string | null { const contentDisposition = response.headers.get('Content-Disposition'); if (!contentDisposition) return null; const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/); if (!match?.[1]) return null; const raw = match[1].replace(/['"]/g, ''); try { return decodeURIComponent(raw); } catch { return raw; } } /** * 파일 ID로 다운로드 * @param fileId 파일 ID * @param fileName 저장할 파일명 (선택, 없으면 서버에서 제공하는 이름 사용) */ export async function downloadFileById(fileId: number, fileName?: string): Promise { try { const response = await fetch(`/api/proxy/files/${fileId}/download`); if (!response.ok) { throw new Error(`다운로드 실패: ${response.status}`); } const blob = await response.blob(); const downloadFileName = fileName ?? extractFilenameFromHeader(response) ?? `file_${fileId}`; downloadBlob(blob, downloadFileName); } catch (error) { console.error('[fileDownload] 다운로드 오류:', error); throw error; } } /** * 파일 경로로 새 탭에서 열기 (미리보기용) * @param filePath 파일 경로 */ export function openFileInNewTab(filePath: string): void { // 백엔드 파일 서빙 URL 구성 const baseUrl = process.env.NEXT_PUBLIC_API_URL || ''; const fileUrl = `${baseUrl}/storage/${filePath}`; window.open(fileUrl, '_blank'); }