웹앱프로젝트/Java Script

[JS] 첨부파일 FormData 로 보낼 때, java 에서 object인식 못하는 문제 해결

Minah Park 2022. 10. 25. 08:13
반응형

 

<tr>
    <th scope="row">첨부파일</th>
    <td colspan="3">
        <div class="file-upload type03 fix-width">
            <label for="files" class="btn default"><span>파일 업로드</span></label>
            <input type="file" id="files" class="file-input" name="files[]" multiple />
            <c:if test="${noticeInfoMap.fileList ne null}">
                <c:forEach var="fileList" items="${noticeInfoMap.fileList}">
                    <div class="pip" id="atchFileSn${fileList.atchFileSn }">
                        <img class="imageThumb" src="/images/admin/cmpt/file-ico.png">
                        <span class="file-tit"><a href="javascript:void(0);" onclick="downloadFileBtn(${fileList.atchFileSn}, 'FILE04')">${fileList.orgnFileNm}</a></span>
                        <button type="button" class="remove" onclick="removeFileIcon(this, ${fileList.atchFileSn})">
                            Remove image
                        </button>
                    </div>
                </c:forEach>
            </c:if>
        </div>
    </td>
</tr>
var noticeData = new FormData();
var deletedFileSn = '';

// 첨부파일 삭제
function removeFileIcon(obj, atchFileSn){
    $(obj).parent(".pip").remove();
    var fileName = $(obj).parent('.pip').find('.file-tit').text();

    // 새로 추가된 파일일 경우에만,
    if(atchFileSn == undefined || atchFileSn == null || atchFileSn == ''){
        for(i=0; i<fileArr.length; i++){
            if(fileArr[i].name == fileName){
                fileArr.splice(i, 1);
            }
        }
    // 이미 존재하던 파일을 삭제했을 경우, 삭제한 파일의 SN 담기
    }else{
        if(deletedFileSn == ''){
            deletedFileSn = atchFileSn;
        }else{
            deletedFileSn = deletedFileSn +','+ atchFileSn;
        }
    }
   
}

// 수정
function updateNotice(){

    for(var i=0; i < fileArr.length; i++){
        noticeData.append("addAttachedFile", fileArr[i]);
    }

    // 기존 등록되어있는 파일을 삭제한 경우
    if(deletedFileSn != ''){
        noticeData.append('deletedFileSn', deletedFileSn);
    }
    noticeData.append("brdMngSn", noticeInfo);

    $.ajax({
        url : 원하는 url,
        type: 'POST',
        data: noticeData,
        enctype: 'multipart/form-data',
        dataType : 'json',
        processData: false,
        contentType: false,
        success : function(data) {
        },
        error : function(data){
        }
    })
}

기존에는 

이미 존재하던 파일을 삭제했을 경우, 삭제한 파일의 SN을 [ ] array 에 담아서 수정 function 에서 FormData로 선언되어진 noticeData에 append 를 이용해서 array 자체를 담아서 보냈다.

그래서 java 단에서 받아온 map을 키로 찾아서 List 로 cast를 시도했는데, String 을 List로 cast 할 수 없다며 에러가 발생했다. 그래서 Object자체를 그대로 받아오지 못하는 것 같았다.

그래서 말씀드리니, Deep Copy 를 해야한다고 하셧다. 근데 그거는 오히려 너 복잡할 수 있어서. array 로 보내지않고

결 국, 해결 방법!!!

[ 값, 값] 이런식으로 담아서 보냈다.

그걸 사용한 부분이

반응형
// 첨부파일 삭제
function removeFileIcon(obj, atchFileSn){
    if(deletedFileSn == ''){
        deletedFileSn = atchFileSn;
    }else{
        deletedFileSn = deletedFileSn +','+ atchFileSn;
    }
}

이부분!

그래서 자바단에서 split을 이용해 String[] 의 형식으로 바꿔 사용해서 List를 대체해서 사용했다!!!!

java

public HashMap<String, Object> updateBoard(HashMap<String, Object> map, MultipartHttpServletRequest request){
    HashMap<String, Object> resultMap = new HashMap<String, Object>();
    // 기존파일 삭제 정보가 존재하면, delete
    if(map.get("deletedFileSn") != null) {
        // , 를 기준으로 잘라서 String만 받아와서  [] array 화 시켜 담음
        String[] deletedFileList = map.get("deletedFileSn").toString().split(",");

        for(String deletedFileSn : deletedFileList) {
            fileInfoMap.put("atchFileSn", deletedFileSn);
        }
    }
    return resultMap;
}

 

반응형