개발노트/JavaScript
[JavaScript] _setFileUploadSendResult로 파일 업로드 구현하기
dev-mylee
2025. 1. 16. 20:58
오늘 파일 업로드 기능 구현하다가 생긴 트러블 슈팅 정리
파일 업로드할 때 popup window 써서 처리하려니 이벤트 흐름 파악이 중요했음.
1. 기본 구조
btnFileUpload 버튼 클릭 → eventFileUpload 함수 호출 → _setUploadWindow로 팝업 오픈 → 팝업에서 파일 선택 후 확인 → _setFileUploadSendResult 콜백으로 결과 받음
2. 실제 구현
<!-- 파일 업로드 버튼 이벤트 -->
$(document).on("click", "[id^='btnFileUpload']", function(e) {
var rowIndex = $(this).closest("tr").index(); // 현재 행 인덱스
eventFileUpload(rowIndex);
e.preventDefault();
});
파일 업로드 팝업 열기
function eventFileUpload(rowIndex) {
var idx = rowIndex || 0; // undefined면 0
var path = "설정된 파일 저장 경로";
// 파일 업로드 팝업에 넘길 파라미터
var param = 'limitCount=10' + // 최대 파일 수
'&atchFileId=' + // 신규면 빈값
'&atchType=file' +
'&dirPath=' + path +
'&kindCd=ABBS' + // 업무구분코드
'&returnParam=new|' + idx; // 상태|행인덱스
// 기존 파일이 있는 경우
if($('#atchFileId').val()) {
param = '...기존 파일ID 포함한 파라미터';
}
_setUploadWindow(encodeURI(param)); // 팝업 오픈
}
파일 업로드 결과 처리 (문제 발생 구간!!!!!!)
function _setFileUploadSendResult(data, returnParam) {
if(!data || !data[0]) return; // 데이터 없으면 종료
var fileInfo = data[0];
var idx = returnParam.split('|')[1]; // 행 인덱스 추출
var currentRow = $('#fileTableBody tr').eq(idx);
// 1. 파일명 표시
currentRow.find('input[name="fileNm"]')
.val(fileInfo.orgFileNm);
// 2. 파일 정보 저장 (나중에 form submit할 때 사용)
currentRow.find('.file-info')
.html(JSON.stringify(fileInfo));
// 3. atchFileId 처리 (이거 놓쳐서 한참 헤맴)
if(!$('#atchFileId').length) {
$('<input>').attr({
type: 'hidden',
id: 'atchFileId',
name: 'atchFileId',
value: fileInfo.atchFileId
}).appendTo('#boardForm');
} else {
$('#atchFileId').val(fileInfo.atchFileId);
}
}
3. 트러블슈팅
- 팝업에서 선택한 파일 정보가 안 넘어올 때
- returnParam 구조 확인 필수 (format: "상태|인덱스")
- data[0] 체크 누락하지 말것
- 여러 파일 첨부시 인덱스 꼬이는 문제
- tr.index()로 현재 행 찾을 때 전체 테이블 기준이 아닌 tbody 내 인덱스인지 확인
- 행 추가/삭제시 인덱스 재정렬 잊지 말기
- form submit할 때 파일 정보 누락
- file-info div에 JSON.stringify()로 저장했던 정보 파싱해서 사용
- atchFileId 값 체크 (hidden input 생성 시점 주의)
4. 알게된 점
- 팝업에서 실제 물리적 파일은 이미 서버에 업로드된 상태
- _setFileUploadSendResult는 그 결과값만 받아서 화면에 표시하는 용도
- form submit할 때는 파일 정보만 전송 (실제 파일X)
- 코드 재사용 위해서는 이벤트 흐름 파악이 중요
끝!