달력

12

« 2018/12 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  
.. .. .. [펌] : http://msfury.tistory.com/118

스프링에서 기본적으로 지원하는 CommonsMultipartResolver라는게 있는데

이게 파일 여러개를 지원 안한다...

(뭐하나 제대로 되는게 없긔...)

참고 : http://www.egovframe.org/wiki/doku.php?id=egovframework:rte:fdl:file_upload_%EB%AC%B8%EC%A0%9C

방법을 찾던중

발견한 정부프레임워크 URL

1번링크의 2번 솔루션으로 해결했는데.

영어가 참 중요하다고 느낀게...

2번솔루션 대로 하면 여러파일의 업로드가 되는 대신 내가 원한대로

public class FileForm {
private CommonsMultipartFile file;
private MultipartFile[] fileArr;

public CommonsMultipartFile getFile() {
return file;
}

public void setFile(CommonsMultipartFile file) {
this.file = file;
}

public MultipartFile[] getFileArr() {
return fileArr;
}

public void setFileArr(MultipartFile[] fileArr) {
this.fileArr = fileArr;
}
}

요놈 안에 쏙 안들어 간다...

문제1.

 Map multipartFiles = new HashMap();
...
return new MultipartParsingResult(multipartFiles, multipartParameters);
MultipartParsingResult의 생성자 명세가 바뀐건지 아님 저 소스가 착각을 했던지...

첫번째 인자의 class가 HashMap이 아닌

MultiValueMap<String, MultipartFile> multipartFiles = new LinkedMultiValueMap<String, MultipartFile>();

요렇게 바꿔줘야 한다. 그럼 다음 문제가 발생하는데..

문제2.
// multipart file field
                CommonsMultipartFile file = new CommonsMultipartFile(fileItem);
                if (multipartFiles.put(fileItem.getName(), file) != null) {
                    throw new MultipartException("Multiple files for field name [" + file.getName()
                            + "] found - not supported by MultipartResolver");
                }

MultiValueMap은 키 하나에 여러 Value를 가질수 있게 해주는 Map인데 put이 없다....

set과 add 메소드가 존재하지만 둘다 리턴값이 void라 null비교 구문에서 에러가 난다.

(set은 단일키에 단일 밸류를 입력할수 있게 해주고 add를 쓰게 되면 단일키에 멀티 밸류를 가지게 해준다)

암튼 내가 원하는 대로 처리를 하기 위해 널체크를 따로 했다. 어차피 fileItem.getName()이 널이거나

공백이면 파일 폼은 있었는데 입력을 안해줬다는 얘기니까.

if( fileItem != null && fileItem.getName() != null && !"".equals(fileItem.getName()) ){
multipartFiles.add(fileItem.getFieldName(),file);
}

여기서 중요한게 하나 더 있는데 getName으로 넣은게 아니라 getFieldName을 썼다는것

getName은 파일이름이고 리졸버를 지나간뒤 콘트롤러에서 받을땐 파일 이름이 키가되어 파일을 가져올

수 있다.(이거부터 좀 이상하다...저 소스 의도가 대체 뭔지...음...영어가 딸려서 의도 파악이 잘 안됨;;)

암튼 키를 필드네임으로 바꿔주면

<input type="file" id="fileArr1" name="fileArr" />

로 줬을때 fileArr을 키로 가지고 콘트롤러에 넘겨주게 된다.

그리하면 저 위에 FileForm 클래스에 MultipartFile[] fileArr; 이부분에 배열로 파일을 넣어주게 된다.

그 이후부터는 단일 파일 받았을때처럼 가져와서 처리하고 저장하면 끝~
.
Posted by .07274.

댓글을 달아 주세요

  1. Favicon of http://1381.nmactc.org/media/oakley.php BlogIcon Cheap Oakley sunglasses 2013.07.21 10:44 신고  댓글주소  수정/삭제  댓글쓰기

    귀를 기울여봐 가슴이 뛰는 소리가 들리면 네가 사랑하는 그 사람 널 사랑하고 있는거야.