본문 바로가기
IT 개발/JAVA

파일 업로드 - FileUtils.copyInputStreamToFile()

by Love of fate 2021. 10. 18.
728x90
반응형

● FileUtils를 사용하려면 commons.io를 maven해야 사용할 수 있다. 

 

● FileUtils.copyInputStreamToFile 메소드는 매개변수가 두개 있어야 한다. 

    1. InputStream 소스 : 복사할 파일의 바이트 

    2. File : InputStream 소스의 바이트를 copy 할 File 데이터

 

- InputStream 소스의 경우 복사할 바이트이기 때문에 Null이면 안되고 덮어쓸 File 데이터의 경우 디렉토리 또는

  Null이 아니어야 한다. 

 

Exception) : IOException

- 스트림, 파일 및 디렉터리를 사용 하 여 정보에 액세스 하는 동안 throw 되는 예외에 대 한 기본 클래스이다.

  기본 클래스 라이브러리에는 다음과 같은 형식이 포함 되어 있으며, 각 형식은의 파생 클래스이다.

  • DirectoryNotFoundException
  • EndOfStreamException
  • FileNotFoundException
  • FileLoadException
  • PathTooLongException

 

- destination디렉토리인 경우

- destination쓸 수 없는 경우

- destination생성  필요하지만 생성할 수 없는 경우

- 복사 중 IO 오류가 발생한 경우

 

 

IOException (Java Platform SE 7 )

Constructs an IOException with the specified detail message and cause. Note that the detail message associated with cause is not automatically incorporated into this exception's detail message.

docs.oracle.com

 

fileUpload HTML

 - fileUpload를 하기 위해서 첫번째로 필수입력사항으로 Form 태그에 enctype="multipart/form-data" 를 선언해 준다.

 

   <form> 태그의 enctype 속성은 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시

   한다. enctype 속성은 <form> 요소의 method 속성값이 “post”인 경우에만 사용할 수 있다.

 

● fileUpload.js 

파일은 아무 형태로나 서버로 전달할 수 없다.

위에서 받아온 file도 그 형태 그대로 전달 할 수 없기때문에 formData 라는 것을 사용한다.

 

let formData = new FormData();

 

파일과 그 해당 파일과 관련된 text를 모두 보내는 경우 동일한 딕셔너리(객체)에 담아 보낼 수 없기때문에

append를 이용해서 formData에 file데이터를 담는다.

 

formData.append("변수명", $("INPUT[name=file]")[0].files[0]);

- 글쓴이의 경우 파일이 하나이기때문에 append를 한번만 사용했지만 여러개의 file일 경우

  for문을 이용하여 formData에 append 해야 한다.

 

processData 관련하여, 일반적으로 서버에 전달되는 데이터는 query string 이라는 형태로 전달된다. (아래 빨간 부분)

ex) http://example.com/over/there?title=Main_page&action=raw

data 파라미터로 전달된 데이터를 jQuery 내부적으로 query string 으로 만드는데, 파일 전송의 경우 이를 하지 않아야 하고 이를 설정하는 것이 processData: false 이다.

 

contentType 은 default 값이 "application/x-www-form-urlencoded; charset=UTF-8" 인데, "multipart/form-data" 로 전송이 되게 false 로 넣어준다. false 로 넣어주는 것이 언뜻 이해가 안되서 false 말고 "multipart/form-data" 를 넣어봤는데 boundary string 이 안들어가게 되어 제대로 동작하지 않았다.

 

위 내용와 같이 이유로 ajax로 file 데이터를 넘길 때에는 processData와 contentType을 false로 명시해주어야 한다.

● fileUploadController : JAVA

- file data는 MultipartFile로 받으면 되는데, file이 여러개일 경우 MultipartFile [] 로 받으면 된다.

- 위에서 언급했던것과 같이 FileUtils.copyInputStreaToFile의 내용을 보면 

  form데이터에 담겨있던 file데이터의 바이트(flpth.getInputStream), saveFile (File)을 매개변수로 넣어 

  flpth 파일을 saveFile에 copy하여 내보낸다.

728x90
반응형