본문 바로가기
CLASS/SPRING,JSTL

#4-1 / spring + I/O

by hingu 2024. 7. 11.

 [file I/O 정리] 

  1. commons-upload => pom.xml
  2. webpage.xml => defaultEncoding,maxUploadSize="-1",
    maxlnMemorySize(속도향상) : 단점- 메모리 과부하로 인하여 서버가 shutdown될 수 있음
  3. Front-end : 파일첨부1개, 파일첨부 여러개, 파일첨부 1개씩 여러개 담을 경우
  4. Java Controller에서 @RequestParam("name명") MultipartFile 객체명
  5. FileCopyUtils.copy() 를 이용해 웹 디렉토리 출력가능
  6. commons-upload 라이브러리 : localhost서버, CDN서버에서 사용 가능(상대방 서버)

 

[ I/O 파일 업로드 라이브러리 사용 - setting ]

mvnrepository 여기서 Apache Commons FileUpload » 1.5 이거 pom.xml에 복붙

=> 
webpage.xml 에

<!-- 파일업로드 사용할수 있도록 Class를 XML로 로드 -->
<!-- id="multipartResolver" : id고정! 주의 -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <beans:property name="defaultEncoding" value="utf-8"></beans:property>
    <beans:property name="maxUploadSize" value="-1"></beans:property>
    <beans:property name="maxInMemorySize" value="200000"></beans:property>
</beans:bean>

=> server restart 

 

👀

value="-1"  :  최대 업로드 파일 용량 제한 없음 (제한 하고싶으면 용량 변환해서 작성 , 실제서버에서는 -1로함)

maxInMemorySize

: 너무 높게 잡으면 서버가 죽을수 있으니 주의 (2097152 : 2MB) 

 maxInMemorySize 

Tomcat에서 사용되는 메모리와 대칭이 되며 
server.xml에 메모리 max사이즈에 할당되는 사이즈만큼 적용 가능하다, 그 이상일 경우 error!

 


 

⚡ 파일 업로드

 1. fileupload.jsp
<body>
	<form id="frm" method="post" action="./fileupok.do" enctype="multipart/form-data">
		<p>첨부파일 업로드</p>
		파일첨부 : <input type="file" name="mfile"><br>
		<input type="button" value="전송" onclick="fileupload()">
	</form>
</body>

<script>
	function fileupload(){
		frm.submit();
	}	
</script>


 2. shop_main2.java ( Controller ) 새로 생성

enctype="multipart/form-data"
이거 꼭 써줘야함!!
package shop;

//~ import 생략

@Controller
public class shop_main2 {
	@Autowired
	BasicDataSource dbInfo;
	PrintWriter pw = null; 
	
	@PostMapping("/fileupok.do")
	public void fileupok(@RequestParam("mfile") MultipartFile files,HttpServletRequest req) throws Exception {
		// HttpServletRequest req : 이게 없으면 realpath를 가져오지 못함!!  
		
		String filenm = files.getOriginalFilename(); //첨부한 파일명 
		long filesize = files.getSize(); //첨부한 파일 사이즈
		String filetype = files.getContentType(); //첨부한 파일 속성
		String url = req.getServletContext().getRealPath("/upload/");
		String result = url + filenm;
				
		if(filesize > 2097152) { //2MB제한
			System.out.println("첨부파일 용량은 2MB 이하입니다.");
		}else {
			FileCopyUtils.copy(files.getBytes(), new File(result)); //첨부한 파일을 저장시키겠다 
		}
		
	}
	
}


- 여긴 i/o라 예외처리 필수(try~catch or throws Exception)
- files : 이름 암거나 지으면됨
- @RequestParam("input name명")
- MultipartFile : interface임 
- HttpServletRequest req : 이게 없으면 realpath를 가져오지 못함!!


 3.
D:\spring\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\webspring

    에 upload 디렉토리 만들어주삼

 

⚡ 파일 여러개 첨부

위 파일에서 진행
- fileupload2.jsp
<body>
	<form id="frm" method="post" action="./fileupok2.do" enctype="multipart/form-data">
		<p>첨부파일 업로드</p>
		파일첨부1 : <input type="file" name="mfile"><br>
		파일첨부2 : <input type="file" name="mfile"><br>
		파일첨부3 : <input type="file" name="mfile"><br>
                <!-- 둘다 받는 방식 동일! -->
                파일첨부 multiple : <input type="file" name="mfile" multiple="multiple"><br>
		
                <input type="button" value="전송" onclick="fileupload()">
	</form>
</body>

<script>
	function fileupload(){
		frm.submit();
	}	
</script>


- shop_main2.java
에 추가 - @PostMapping("/fileupok2.do")
/*-- 첨부파일 여러개인 경우 --*/
@PostMapping("/fileupok2.do")
public void fileupok2(@RequestParam("mfile") MultipartFile files[], HttpServletRequest req ) throws Exception {
    //front에서 동일한 name을 사용한 갯수만큼 출력 : (비어있어도 null 이기 때문 3출력)
    int file_ea = files.length; 

    System.out.println(files[0].getOriginalFilename());
    System.out.println(files[1].getOriginalFilename());
    System.out.println(file_ea);
}


- 첨부파일 input name이 동일한 경우 원시배열로 받아야함!
- 이름이 다 다른 경우 @RequestParam("mfile1") MultipartFile files1,@RequestParam("mfile2") MultipartFile files2
이렇게 받아야함..!