Apache Commons Fileupload의 Stream API 이용시 폼 정보 얻기.
맨처음에 Form의 정보중 파일이 넘어오는 것을
FileItemIterator의 하나의 FileItemStream을 가지고 읽으면서
폼정보 인지 아닌지만 파악했었다.
하지만 이는 지극히 예제 소스에 의존한 것으로 폼에서 같이 오는 텍스트 정보를 얻을수
없었다.
html 에 대한 이해도가 없던 나는 파일과 텍스트를 함께 보내는 것은 불가능 한것인가하고
생각하다가 여러 사이트에서 당연스레 가능하다는 것을 알았고 말도 안된 다는 것을 알았다.
사이트에보면 단순 Apache commons fileupload에서 폼정보를 얻어오는 것은 나온다.
단순하게 FileItem의 getString() 메소드를 쓰면 되는 것이다.
하지만 Stream을 이용하여 속도가 빠르고 용량도 특별히 지정하지 않아도 잘 되고
Windows7보다 속도는 느리더라도 그냥 API보다는 확실히 빠른 기능을 이용하고 싶다면
이방법은 안된다. 왜냐면 FileItemStream을 이용하기 때문!!
서론이 길었지만
쉽다;
getFieldName로 필드 이름(html의 name 속성)을 알아내고
그냥 스트림을 openStream()으로 읽어서 버퍼에 담고
그 byte버퍼를 Sting에 유니코드로 넣으면 되는것이다.
if (item.getFieldName().equals("upfile")) { //파일 내용 파일에 쓰기
if(printed){
writeFile=new File(path+FilenameUtils.getName(item.getName()));
outFile=new FileOutputStream(writeFile);
printed=false;
}
byte buf[]=new byte[1024];
try{
int len;
while((len=stream.read(buf))>0){
outFile.write(buf,0,len);
}
outFile.close();
stream.close();
}catch(Exception e){
out.print("에러가 발생했어요.. "+e.toString());
}
}else if(item.getFieldName().equals("note")){ //폼 데이터 얻어오기
byte[] buf=new byte[1024];
stream.read(buf);
String note = new String(buf,"utf-8");
out.print("보낸글 : "+note);
stream.close();
}
보라; 간결하지 않은가 ㅋ
이 쉬운걸 왜 나는 3시간이나 찾아 헤매었단 말인가!!
막히면 해당 정보 조금 더 공부하고
Javadoc을 잘 읽고 메소드를 확인하는
올바른 방법을 택했더라면 좀더 빨리 해결 했을 것이다.
불가능도 없고 막연한 두려움도 필요없다.