파일 업로드건 마무리와 그외 작업
2010-07-31 15:49:34

[명세 및 작업 내역]

1. 업로드시는 Stream이 Inputstream으로 나와서 이걸 Mappedbytebuffer로 바꾸고 그걸 파일로 저장하는 것이 필요없다고 생각되어 안함.

2. 파일 타입을 확인하여 올바른 폴더에 넣는다. 헤더 같은 것을 보지 말고 그냥 확장자로 한다. 이유는 파일 업로드는 관리자 만 할 수 있게 할 것이므로 사이트에 장난을 친다고 생각할 수 없고 혹시 다른 파일을 확장자를 바꿔 보내 더라도 폴더가 달라지고 보여주는 태그가 잘 못 나올우려뿐 큰 문제가 일어나지 않는다.

[앞으로의 작업 내역]

1. 사진, 문서(microsoft office, text, html), 동영상(activeX용, 일반동영상), 음악은 파일 형식에 따라 글쓴이(관리자)가 쉽게 보여줄 위치, 재생 여부, 다운 로드 여부 를 적을수 있도록 해야한다.

[다른 작업의 진행]

1. 페이지 문제 요청디스패처로 해결해야함?

▼ more
JSP에서 getOutputStream() has already been called for this response 에러 해결
2010-07-30 15:03:18

JSP / Servlet 작성하다 보면 파일 다운로드 사항이 들어간다.

이때 Java와 Jsp에서 처리하는 것에 차이가 발생한다.

jsp에서 getOutputStream을 불러오는 것 만으로 에러가 발생하는데

이중 하나가 getOutputStream() has already been called for this response 에러 이다.

해당 에러는 jsp에서 outputstream을 사용할때 servlet에서 생성된 out 객체와 중복되어 발생하는 에러다.

이때 servlet에서 생성된 out(JspWriter)객체를 clear시키고 jsp에서 다시 생성해서 사용하면 되는 것이다.

out.clear로 out객체를 clear시키고

out에 pageContext.pushBody(); 로 새로운 out 객체를 생성해서 넣어주면된다.

pushBody

public BodyContent pushBody()Return a new BodyContent object,

save the current "out" JspWriter,

and update the value of the "out" attribute

in the page scope attribute namespace of the PageContext.

▼ more
자바 I/O & NIO 네트워크 프로그래밍
2010-07-30 14:34:29

자바 I/O & NIO 네트워크 프로그래밍

tags : 도서

▼ more
Apache Commons Fileupload의 Stream API 이용시 폼 정보 얻기.
2010-07-30 09:38:30

맨처음에 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을 잘 읽고 메소드를 확인하는

올바른 방법을 택했더라면 좀더 빨리 해결 했을 것이다.

불가능도 없고 막연한 두려움도 필요없다.

▼ more