본문 바로가기
CLASS/SERVLET

#7-2 / 첨부파일 기능 - java + io

by hingu 2024. 6. 19.

cos 사용하는 방법도 잇음 - 궁금하면 google에 쳐보세욘

 

이 예제는 database 전달 없음

⚡ 첨부파일 기능
첨부파일은 get으로 날릴수 없음 => post로만 날릴 것!

- fileupload.html 
enctype :
기본(따로 작성안할시)이 application/x-www-form-urlencoded 으로 되어있음 
multipart/form-data : input type이 파일일 경우는 무조건 이걸로 받아야함
form태그 속성
<body>
	<form id="frm">
		첨부파일 : <input type="file" name="mfile" id="mfile"><br>
		<input type="button" id="btn" value="전송">
	</form>
</body>

<script type="text/javascript">

$(function(){
    var result=""; //file 속성 확인을 위한 변수
    $("#btn").click(function(){
        if($("#mfile").val() != ""){ //파일 첨부시
            var filesize = $("#mfile")[0].files[0].size; //size 정상출력
            var filetype = $("#mfile")[0].files[0].type; //image/jpeg 출력

            if(filesize > 2097152){ //2MB이상
                alert("파일첨부용량은 2MB이하만 가능합니다");
                result = "no";
            }else{ //2MB이하이며 첨부파일시 파일속성은 이미지만 받음
                var $f = ["png","jpeg","jpg","gif","webp","svg","bmp"];
                var i;
                for(i=0; i<$f.length; i++){
                    if(filetype.indexOf($f[i]) >= 0){
                        result = "ok";
                        break;
                    }else{
                        result = "no";
                    }
                }
                if(result == "ok" || result == ""){
                    $("#frm").attr("method","post");
                    $("#frm").attr("action","./fileok.do");
                    $("#frm").attr("enctype", "multipart/form-data");
                    $("#frm").submit();
                }else{
                    alert("해당 첨부파일은 이미지 및 압축(zip)파일만 가능합니다.");
                    $("#mfile").val("");
                }
            }
        }else{
            alert("아무것도 첨부되지 않았습니다");
        }
    });
})

</script>



- fileok.java

@의 역할
- 첨부파일 환경설정 세팅
@MultipartConfig( )
fileSizeThreshold :한개의 파일 전송 크기
maxFileSize = 업로드 가능한 최대 크기 
maxRequestSize = 여러개의 파일 전체 용량 

- 라이브러리를 객체화 하지 않고 쉽게 로드를 할수 있게끔 하는 기능(xml기능중 하나)
- spring에서 많이쓰임 
- maxFileSize을 너무 작게 잡고 너무 큰 파일을 올리면 서버가 죽어버림! 넉넉하게 세팅하는게 좋다,
  업로드 가능 파일 용량은 프론트단에서 검토하고,백단에서 따로 조건문을 지정해주는게 좋다

part :
interface api 자료형(servlet 3.0) => file에만 사용
multipart/form-data 형태로 전송된 POST 요청의 항목 데이터를 다루는 기능들이 정의된 인터페이스.


web 경로
request.getServletContext()  : 웹 전체 경로를 설정하는 class
getRealPath() : 웹 디렉토리 경로

//첨부파일 환경설정 세팅
@MultipartConfig(
	fileSizeThreshold = 1024*1024*2, //한개의 파일 전송 크기 - 2MB로 세팅함
	maxFileSize = 1024*1024*50,//업로드 가능한 최대 크기 - 50MB로 세팅함(10정도..?적당)
	maxRequestSize = 1024*1024*100 //여러개의 파일 전체 용량 - 100MB로 세팅함
)

public class fileok extends HttpServlet {
	private static final long serialVersionUID = 1L;
	PrintWriter pw = null;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf8");
		response.setContentType("text/html;charset=utf-8");
		this.pw = response.getWriter();
		
		//String mfile = request.getParameter("mfile"); 
		//파일첨부기능은 이것만 있으면 안됨, front에서 enctype도 설정해줘야함
		Part mfile = request.getPart("mfile");
		String filename = mfile.getSubmittedFileName(); //첨부파일명
		long filesize = mfile.getSize(); //첨부파일 용량(byte단위로 체크)
		
		//2MB제한(위 maxFileSize는 서버 죽지말라고 넉넉하게 세팅,따로 조건문을 지정해주는게 좋다)
		if(filesize > 2097152) {
			this.pw.write("<script>"
					+ "alert('첨부파일 용량은 2MB이하만 가능합니다');"
					+ "history.go(-1);"
					+ "</script>");
		}else {
			if(filename != "" && filesize > 0) { //첨부한 파일이 있을 때
				//웹 directory에 저장
				String url = request.getServletContext().getRealPath("");
				mfile.write(url+filename); //해당 웹경로에 파일을 저장시킴
			}
		} 
		this.pw.close();
	}
}

 

 

 

👀 web경로

⚡ 현재 서버에 저장시 web경로에 저장!
String url = request.getServletContext().getRealPath(""); //or ("/")
//D:\servlet\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\web

String url = request.getServletContext().getRealPath("/fileupload/");
//D:\servlet\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\web\fileupload


1. 소스파일들이 있는 경로와
   실제 웹에서 작동되는 경로는 다르다! (이게 web경로)
2. http://localhost:8080/dog.jpeg 에서 이미지 업로드 확인 가능
    폴더에서 확인시에는 타고타고 들어가서 확인 가능


JAVA I/O : socket 통신 형태
WEB I/O : 프로토콜 (http or https) 통신 형태 (라우팅 형태)
=> 프로토콜에는 http,https,ftp,sftp,pop3,imap,ssh....등 이 있다....

둘다 [TCP,UDP]로 나눠지긴 함

 

 

 

👀

100MB : byte단위

100Mb,100mb : bit단위 (환산시 1.5MB밖에 안됨)