( 파일 업로드 중 ) StringIndexOutOfBoundsException : String index out of range: -1

pickylemon·2024년 5월 12일

Exception 모음

목록 보기
12/31

StringIndexOutOfBoundsException : String index out of range: -1

상황

  • 뷰에서 업로드한 파일을 처리하는 과정에서 index out of bounds 발생
  • 원본파일명에서 확장자를 추출하는 메서드에서 터진 에러
  • 뷰에서는 여러개의 파일 첨부 태그가 있지만, 그 중 하나에 하나의 파일만 첨부한 상황

원인

  • 뷰에서 <input type="file" name="attFile" /> 태그를 3개 두고 컨트롤러 메서드에서 @RequestParam어노테이션을 붙여 해당 attFile 이름으로 첨부파일 배열을 받는 상황.
    즉, 컨트롤러로 들어가는 배열의 크기는 3으로 고정인 상황이다.
  • 실제로 파일을 첨부를 하지 않은 태그이지만, 빈(?) MultipartFile로 컨트롤러에서 인식이 되는 것
	@PostMapping("/{boardTypeSeq}/write.do")
	public String write(
			@PathVariable("boardTypeSeq") int boardTypeSeq,
			@RequestParam HashMap<String, String> params,
            MultipartFile[] attFiles, //input태그 갯수만큼이 배열 길이로 고정됨
			HttpSession session,
			Model model, RedirectAttributes rattr) {
            ...
     }
  • 이미지를 하나만 첨부하였을때의 결과를 컨트롤러에서 찍어보았다.
  • 첨부되지 않은 파일에 대해서 MultipartFile 객체가 생성되고, 또 그 원본파일명이 빈문자열로 인식이 되는데 거기다대고 확장자를 추출하려고 indexOf와 substring을 호출하니까 indexOutOfBoundsException이 발생하는 것은 당연.

해결

  • 배열에 대해 루프를 다 돌며 첨부파일을 처리해서는 안된다.
  • 루프르 돌되 MultipartFile이 비어있지 않은 조건에서만 코드를 수행하도록 조건문을 추가해주었다.
  • if(!mf.isEmpty())
@Transactional
	public int savePost(BoardSaveDto dto, MultipartFile[] mfs) {
		int code = 1;
		try {
			//1. 게시글 데이터 DB에 저장
			int boardSeq = boardRepository.save(dto); //내부적으로 keyholder를 사용해 pk반환
			
			for(MultipartFile mf : mfs) { //첨부파일 배열에 대해 루프 돌림
				if(!mf.isEmpty()) { //여기 조건문을 추가해주었다.
					//2. 첨부파일 물리적 저장 및	
					File destfile = fileUtil.saveFiles(mf);
					//3-1. BoardAttachDto 생성
					BoardAttachDto attachDto = BoardAttachDto.makeBoardAttachDto(mf, destfile);
					attachDto.setBoardSeq(boardSeq);
					attachDto.setBoardTypeSeq(dto.getBoardTypeSeq());
					//3-2. 첨부파일 메타데이터 DB에 저장
					boardAttachRepository.saveAttachFile(attachDto);
				}
			}
  • 참고, MultipartFile mf 객체가 빈 객체인지 확인할때는
    ObjectUtils.isEmpty(mf)가 아닌, mf.isEmpty()를 사용해야 한다.
    전자를 사용하면 비어있는 객체도 true가 나옴.
    (내부 동작이 다른 것 같은데 추후에 더 알아보도록 하겠음)
profile
안녕하세요

0개의 댓글