import { fileClient } from '@/resources/api/index'; import uploadProgressStore from '@/resources/js/uploadProgressStore'; // 파일 업로드를 처리하는 서비스 const uploadService = { // POST 메서드를 사용한 업로드 (등록) async uploadWithPost(url, formData, options = {}) { // 파일 정보 추출 const file = formData.get('multipartFiles') || formData.get('file'); if (file) { // 업로드 상태 초기화 및 파일 전송 단계 시작 (이 초기화는 유지) uploadProgressStore.startUpload(file.name, 1); } try { // 1단계: 파일 전송 단계 uploadProgressStore.setStage('uploading'); // fileClient.post를 사용하여 업로드 요청 const response = await fileClient.post(url, formData, { ...options, onUploadProgress: (progressEvent) => { // 진행 상태 업데이트 uploadProgressStore.updateProgress(progressEvent.loaded, progressEvent.total); // 사용자 정의 onUploadProgress 콜백이 있으면 호출 if (options.onUploadProgress) { options.onUploadProgress(progressEvent); } // 업로드가 완료되면 처리 중 단계로 전환 if (progressEvent.loaded === progressEvent.total) { // setTimeout을 사용하여 처리 단계 전환을 강제로 비동기 실행 setTimeout(() => { uploadProgressStore.setStage('processing'); }, 100); } } }); // 서버 응답 수신 - 처리 완료 표시 uploadProgressStore.completeProcessing(); // 잠시 후 응답 반환 (처리 완료 상태를 보여줄 시간 제공) await new Promise(resolve => setTimeout(resolve, 500)); // 응답 반환 (alert은 API 함수에서 처리) return response; } catch (error) { // 오류 발생 시 상태 초기화 uploadProgressStore.handleError(); throw error; // 오류 다시 throw } }, // PUT 메서드를 사용한 업로드 (수정) async uploadWithPut(url, formData, options = {}) { // 파일 정보 추출 const file = formData.get('multipartFiles') || formData.get('file'); if (file) { // 업로드 상태 초기화 및 파일 전송 단계 시작 (이 초기화는 유지) uploadProgressStore.startUpload(file.name, 1); } try { // 1단계: 파일 전송 단계 uploadProgressStore.setStage('uploading'); // fileClient.put을 사용하여 업로드 요청 const response = await fileClient.put(url, formData, { ...options, onUploadProgress: (progressEvent) => { // 진행 상태 업데이트 uploadProgressStore.updateProgress(progressEvent.loaded, progressEvent.total); // 사용자 정의 onUploadProgress 콜백이 있으면 호출 if (options.onUploadProgress) { options.onUploadProgress(progressEvent); } // 업로드가 완료되면 처리 중 단계로 전환 if (progressEvent.loaded === progressEvent.total) { // setTimeout을 사용하여 처리 단계 전환을 강제로 비동기 실행 setTimeout(() => { uploadProgressStore.setStage('processing'); }, 100); } } }); // 서버 응답 수신 - 처리 완료 표시 uploadProgressStore.completeProcessing(); // 잠시 후 응답 반환 (처리 완료 상태를 보여줄 시간 제공) await new Promise(resolve => setTimeout(resolve, 500)); // 응답 반환 (alert은 API 함수에서 처리) return response; } catch (error) { // 오류 발생 시 상태 초기화 uploadProgressStore.handleError(); throw error; // 오류 다시 throw } } }; export default uploadService;