'파일 업로드'에 해당되는 글 3

  1. 2014.02.10 [Grails] 파일 업로드 - 여러 개의 파일을 첨부(데이터베이스에 저장)
  2. 2011.10.04 Apache Commons FileUpload
  3. 2010.10.14 파일 스트림을 이용해서 복사하기

[Grails] 파일 업로드 - 여러 개의 파일을 첨부(데이터베이스에 저장)

Apache Commons FileUpload

commons-fileupload-1.2.2.jar
commons-io-1.3.2.jar

JDK 1.4에서도 잘 동작함.

http://commons.apache.org/fileupload/dependencies.html

[todo] 사용법 좀 더 추가

파일 스트림을 이용해서 복사하기

서버가 여러 대인 시스템 구성에서 FCKeditor를 이용하면서 파일을 업로드하는 기능을 구현
업로드한 파일이 여러 대의 서버에 저장되거나 단일 파일 서버에 저장되어야 함.
웹에디터의 특성으로 인해 파일(업로드된 이미지)이 웹어플리케이션내에 존재해야 함.
각 서버에 업로드된 이미지 파일이 있어야 하므로 업로드하면서 파일을 각 서버에 복사하기로 함.

- 윈도우즈 환경이라서 네트워크 드라이브를 바로 가기로 만들어서 했는데 안된다고 함.(뭔 말이고???)

- 어떻게 파일 업로드하는 부분을 찾아서 왔다.
net.fckeditor.connector.impl.AbstractLocalFileSystemConnector 를 수정했다고 한다.
그러나 적합한 디렉토리가 아니라는 둥, 에러가 난다.

- 여차저차 디렉토리를 생성하도록 하고 나니 이번에는 파일은 생성되는데 크기가 0이라고 한다.
메서드의 인자중 하나가 inputStream(FileInputStream)으로 넘어온다.
이 스트림을 가지고 org.apache.commons.io.IOUtils.copyLarge(InputStream input, OutputStream output) 을 이용해서 복사한다.

스트림을 이용해서 파일을 복사하고 나면 스트림 끝에 도달했으므로 두번째 복사부터는 파일을 쓸수가 없다.(WRITE)
스트림을 어딘가에 저장해 두었다가 파일 복사할때 스트림을 처음으로 되돌려서 사용하는게 좋겠다.
적당한 녀석이 ByteArrayInputStream 이다.
(RamdomAccessFile 도 될수 있을라나?)

파일 스트림을 읽어서 바이트 배열로 만들어야 하는데 System.arraycopy() 를 쓰면 되겠다 싶었다.

- 물어보기만 하던 녀석이 ByteArrayOutputStream 을 쓸거라고 한다.
오...호

읽어들인 스트림을 처음으로 돌리려면 reset()을 호출한다.

- 덧붙이면, IOUtils.copyLarge()의 리턴값도 체크할 것. 방어적인 코딩이 정신건강에 좋지 않나.