Spring Framework

Spring Framework - 파일 업로드,다운로드

꾸주니12 2022. 5. 27. 00:14

파일 업로드다운로드를 위한 설정 1,2,3

 

1. 파일 업로드,다운로드에 필요한 라이브러리 추가 - pom.xml 

  • 라이브러리 다운만 받으며 알아서 해줌 ioc제어역행  관련
<!-- MultiPartFile 사용을 위한 라이브러리 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>



<!--  File Upload를 위한 라이브러리 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

<MultiPartFile 사용을 위한 라이브러리 >

Multipartfile 라이브러리 필요한 이유 :   파일인 바이너리 데이터랑 텍스트랑 구분이 필요하다

enctype="multipart/form-data" 를 쓰기위해서인듯

 

 

2 . 라이브러리 관련 설정 - root-context.xml

- Bean 에 클래스 등록해두면, 스프링이 필요하다 판단될 때  가져다 씀 : 의존성주입 

 

root-context.xml : 서버가 켜지면 읽게되는 설정 파일(web.xml 에 경로가 명시되어있음)

<!-- 텍스트 파일 인코딩 -->
<!--  한번에 올릴 수 있는 파일 사이즈--> : 설정된 용량 넘어가면 예외발생 
<!--  메모리 버퍼 용량 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name = "defaultEncoding" value="UTF-8"/>
<property name = "maxUploadSize" value="10000000"/>
<property name = "maxInMemorySize" value="10000000"/>
</bean>

 

 

3. Servers - server.xml 에 /photo라는 요청이 올시 '파일 위치'/upload 파일을 불러올 위치를 지정해준다

  • 클라이언트에서 받은 파일을 서버의 어딘가에 저장해야 한다.
  • 그리고 서버에 요청이 오면 그 폴더의 파일을 가져와야 한다.(클라이언트가 파일을 요청할때)
  • server.xml 에 해당 폴더를 등록해 놓는다. 태그 시작과 끝 을 잘 보고 간격두고 작성해주기 (server.xml 잘못건들면 톰캣이 안켜짐)

server.xml

  • Workspace 바뀌면 위 내용 사라지니 다시 spring 파일관련 프로젝트할 때 기억하기! 

 

**경로 잘 써주기!**

경로쓸 때 "/" 안해주면 Users 폴더 부터 찾는다? - / 써줘야 현재 위치에서 users - 부터 

docBase = "/Users/파일위치/upload"   - 처음에 이렇게 썼는데 서버가 안켜짐

docBase = "/Users/파일위치/upload/"     - upload/   : upload파일 안에 있는 

 

 

 

*파일 업로드 조건

1. POST 로 전송 할 것

  • 데이터를 전송할 때 크기 제한이 없음 
  • 바이너리 데이터 노출되면안됨? 

2.enctype = "multipart/form-data" 옵션을 꼭 써줄 것 

  • multipart : 파라메터?에 문자(text)와 바이너리(file)가 섞여있음. multipart 옵션이 없으면 바이너리인데 문자로 인식해서 전송이 잘안됨

 

 

 

*멀티 파일 업로드 

  • multiple="multiple"  옵션이 있어야 여러개 선택 가능 

 

 

*controller 요청받을시 인자값

Index.jsp                                                                                                                                                                 FileController

                                                                    

- MultipartFile : 인터페이스  : 이 규격에 맞춰서 보내 

- 인자값 변수?는 파일파라메터 이름과 똑같이 하기 

 

-파일과 일반파라메터 같이 올 경우 일반 파라메터는 우선순위가 밀린다. 순서 바뀔 경우 전송 잘 안됨  - 파일 파라메터 먼저

 

 

*service

Controller 에서 service로 요청을 보냈는데 service내에서 사용하는 변수명 수정 가능 

uploadFile - > file 로 바꿔줌 

 

 

 

 

파일 업로드 순서 

1. 파일 명 추출 - 확장자 살리기 

getOriginalFilename메서드 사용

 

*substring

String.substring(start); start위치부터 끝까지 잘라서 가져옴

String.substring(start,end); start 부터 end 전까지 가져옴 

(Start,end 를 숫자로 적으면 String 의 index는 0 부터 시작함)

 

*indexof 와 lastindexof

String.indexof(“A”);   : String의 A가 있는 위치를 왼쪽부터 찾아서 인덱스번호를 알려줌

String.lastindexof(“.”); String의 . 가 있는 위치를 오른쪽(끝)부터 찾아서 인덱스 번호를 알려줌?

 

 

 

2.새 파일명 지어주기 - 저장될 때 겹치는 이름이 있으면 덮어써지니까 

 - 그래서 현재시간 ms 으로 파일이름을 바꿔서 저장해줄거임! 

 

 

3.새 파일명을 저장 - 어디 저장할지 지정 (nio 이용)

 

nio - write(파일 내보내기)

//1. 저장할 위치 지정
		Path path = Paths.get("c:/Temp/test/textFile.txt");
				
		//2. Scanner 에서 값 받아오기
		System.out.print("입력할 메시지>");
		Scanner scan = new Scanner(System.in);
		String msg = scan.nextLine()+"\r\n";	
		
		//3. 읽어온 내용 쓰기(어디서, 어떤 데이터를,추가 옵션)
		Files.write(path, msg.getBytes("UTF-8"),StandardOpenOption.APPEND);
		System.out.println("파일 저장 완료");
		
		/* APPEND : 파일 쓰기시 내용이 끝에 추가되어 기록된다.
		 * WRITE : 새로 쓰기 모드
		 * CREATE : 파일이 없을 경우 생성한다.
		 * CREAETE_NEW : 파일이 이미 존재할 경우 새로 만든다.
		 * READ : 읽기 모드
		 * 
		 * DELETE_ON_CLOSE : 사용 후 삭제
		 * 
		 */

1.파일의 바이트를 추출해서 바이트타입의 배열 arr에 담고 

2.path 클래스를 사용하여 저장할 위치 지정 

3.Files 클래스의 write메서드를 사용하여  파일 저장 

 

 

 

 

멀티 파일 업로드

controller
service

배열로 가져온 files를 향상된 for문으로 하나씩 꺼내주고 service에서 단일 파일 업로드하는 fileupload메서드를 호출함!!

 

 

 

업로드 된 파일 보기

 

controller

여러개니까 ArrayList로 담아올거임 

그리고 그 받아온걸 model로 list라는 이름으로 저장해서 view에 뿌릴거임

 

Service

1. fileList 라는 arraylist타입의 변수 선언 먼저 해주고.

2. 자바 io의 파일객체를 사용해서 업로드 폴더 안에 있는 파일들을 list형태로 가져옴 ? - > listFIles ? 

3. 그게 여러개니까 배열형태의 files 에 담는다.

4. 향상된 for문을통해서 하나씩 가져오는데 이름을 뽑아서 fileList 에 add 해준다. // file.getName() 확장자까지 나옴 

5. 반환값은 fileList

 

 

result.jsp

1. c:foreach 를 사용하여 list에 담긴 것들을 하나씩 빼줌

2. fn태그를 사용하여 path의 확장자가 .jpg , .png, .gif로 끝나는 것들인 경우엔

이미지태그를 사용하여 표시

3. 아닐경우 a 태그 사용하도록 c:choose 코드 작성 

 

4. 만약 업로드된 파일이 없을 경우 즉 list.size() = 0 일경우

업로드 된 사진이 없다고 표시

${list}가 null로 뜨는지 어떻게 뜨는지 확인하기위해서 찍어봐야함 

[] 배열로 뜨니까 위사진처럼 List.size 0이었을때로 작성 하기 

어떻게 코드를 작성해야할지 감이 안올 땐 직접 찍어서 보고 판단하기

 

 

파일 삭제하기

result.jsp

 

이미지파일 과 그 외의 파일 모두 파라메터 이름이 file 인걸 알 수 있다.

 

controller

file 이라는 파라메터 값을 가져올거임! 

service

파일을 객체화하고 (자바 io) 

파일이 만약 존재하면 delete 해라