12. 파일업로드


1. 폼 형태

  • 웹 브라우저를 통해 파일을 전송하기 위한 폼 구성
    • input type = file
    • method = post
    • enctype = multipart/form-data
      • 파일 이름과 함께 데이터 전송
      • 기본값 application/x-www-form-urlencoded
        • 파일 이름만 전송
    • 업로드 컴포넌트 : cos.jar
  • post로 전송된 파라미터는 request 객체를 통해 이름에 해당하는 값을 얻어낼 수 있다
    • multipart/form-data로 지정한 폼은 request 객체로 얻어낸 파라미터의 이름으로 값을 얻어낼 수 없다
    • 이름과 값을 가져오고, input type = file로 지정된 파일을 업로드 하기 위해서는 특별 컴포넌트가 필요
      • www.servlets.com에서 제공하는 cos.jar 파일에서 필요 컴포넌트를 선택하여 업로드 수행

2. MultipartRequest 클래스

  • 생성자
 MultipartRequest(javax.servlet.http.HttpServletRequest request, 
    java.lang.String saveDirectory, 
    int maxPostSize, 
    java.lang.String encoding, 
    FileRenamePolicy policy)
    
MultipartRequest mr = new MultipartRequest(request, //request 객체
    fileDirectory, // 파일이 저장될 경로
    1024*5, // 파일 최대 크기 (1024*5 = 5kb)
    utf-8, // 인코딩 타입
    new DefaultFileRenamePolicy()); //한글 인코딩이나 업로드 파일이 중복 시, 파일명 변경, 덮어쓰기 방지

메서드

캡처
캡처2


3. 예제

uploadTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="frm1" method="post" action="upload_ok.jsp" enctype="multipart/form-data" >
		아이디 : <input type="text" name="id"><br>
		파일 업로드 : <input type="file" name="fileName" size="30"><br>
		<input type = "submit" value="등록"><br>
	</form>
</body>
</html>

upload_ok.jsp

<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//MultipartRequest 객체 생성 성공 -> 업로드 완료
		//실패 -> IOException 발생(용량 초과 등)
		
		String upDir="pos_upload";//업로드할 폴더
		
		String saveDir=application.getRealPath(upDir); //업로드할 폴더 절대경로 구하기
		System.out.println("saveDir = "+saveDir);
		
		saveDir = config.getServletContext().getRealPath(upDir);
		System.out.println("saveDir = "+saveDir);
		
		saveDir = "C:\\lecture\\workspace.list\\jsp_ws\\herbmall\\src\\main\\webapp\\pds_upload";
		
		int maxSize = 2*1024*1024; // 업로드 최대 용량, 2M
		
		String encoding="utf-8"; // 인코딩 형식
		
		//업로드 시 동일한 파일명이 있을 경우 나중에 업로드한 파일에 번호를 붙여 이름 변경
		DefaultFileRenamePolicy policy = new DefaultFileRenamePolicy();
		
		MultipartRequest mr = new MultipartRequest(request, saveDir, maxSize, encoding, policy);
		
		out.print("업로드 완료");
		
		//업로드된 파일 정보 얻어오기
		String fileName = mr.getFilesystemName("fileName"); //변경된 파일명
		String originFileName = mr.getOriginalFileName("fileName"); //원본 파일명
		
		File file = mr.getFile("fileName");
		long fileSize = file.length();
		String id = request.getParameter("id");
		String id2 = mr.getParameter("id");
		
	%>
	<h1> 업로드된 파일 정보</h1>
	<p> 변경 후 파일 명 : <%=fileName %></p>
	<p> 변경 전 파일 명 : <%=originFileName %></p>
	<p> 파일 크기 : <%=fileSize %></p>
	
	<h1> 파라미터</h1>
	<p>id (request) : <%=id %></p>
	<p>id2(mr) : <%=id2 %></p>
</body>
</html>

4. 예제2 다중 업로드

uploadTest2.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>파일 업로드 테스트2</h1>
	<form name="frm1" method="post" action="uploadTest2_ok.jsp" 
		encType="multipart/form-data">
		
		아이디 <input type="text" name="id"/><br>
		주소 <input type="text" name="address"/><br>
		파일첨부<br> 
		<input type="file" name="upfile1" /><br>
		<input type="file" name="upfile2" /><br>
		<input type="file" name="upfile3" /><br><br>
		<input type="submit" value="전송" />
	</form>
</body>
</html>

uploadTest2_ok.jsp

<%@page import="java.io.IOException"%>
<%@page import="java.util.Enumeration"%>
<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//MultipartRequest 객체 생성 성공 -> 업로드 완료
		//실패 -> IOException 발생(용량 초과 등)
		
		String upDir="pos_upload";//업로드할 폴더
		
		String saveDir=application.getRealPath(upDir); //업로드할 폴더 절대경로 구하기
		System.out.println("saveDir = "+saveDir);
		
		saveDir = config.getServletContext().getRealPath(upDir);
		System.out.println("saveDir = "+saveDir);
		
		saveDir = "C:\\lecture\\workspace.list\\jsp_ws\\herbmall\\src\\main\\webapp\\pds_upload";
		
		int maxSize = 2*1024*1024; // 업로드 최대 용량, 2M
		
		String encoding="utf-8"; // 인코딩 형식
		
		//업로드 시 동일한 파일명이 있을 경우 나중에 업로드한 파일에 번호를 붙여 이름 변경
		DefaultFileRenamePolicy policy = new DefaultFileRenamePolicy();
		
		try{
			
			MultipartRequest mr = new MultipartRequest(request, saveDir, maxSize, encoding, policy);
			
			out.print("업로드 완료");
			
			Enumeration enFileNames = mr.getFileNames(); // 여러 파일의 이름 목록 리턴
			
			while(enFileNames.hasMoreElements()){
				String fName=(String)enFileNames.nextElement();
				
				String fileName = mr.getFilesystemName(fName); //변경된 파일 이름
				
				String originFileName=mr.getOriginalFileName(fName); //변경전 파일 이름
				
				File f = mr.getFile(fName);
				long fileSize = 0;
				if(f != null){
					fileSize = f.length();
				}
				
				out.print("업로드된 파일명 : "+fileName+"<br>");
				out.print("원래 파일명 : "+originFileName+"<br>");
				out.print("파일크기 : "+fileSize+"<br>");
				
				
			}
			
			String id = mr.getParameter("id");
			String addr=mr.getParameter("address");
			out.print("<h1> 파라미터 <h1>");
			out.print("id : "+id+"<br>");
			out.print("address : "+addr+"<br>");
			
		}catch(IOException e){
			out.print("2M 이상의 파일은 업로드할  없습니다.");
			e.printStackTrace();
		}
	%>
</body>
</html>

5. 예제 3, 게시판 응용

테이블 sql

--자료실 테이블
drop table reboard  cascade constraint;
create table reboard
(
    no                number        primary key,    --번호
    name         varchar2(20)    not null,            --이름    
    pwd              varchar2(20)    not null,            --비밀번호
    title             varchar2(100)   not  null,            --제목
    email          varchar2(80)    null,            --이메일
    regdate     date        default  sysdate,    --작성일    
    readcount    number        default 0     null,        --조회수
    content         clob         null,            --내용
    groupNo            number          default 0,           --그룹번호
    step           number           default 0,          --글의 단계 
    sortNo         number           default 0,       --글의 정렬순서
    delFlag         char     default 'N',             --삭제 Flag
    fileName    varchar2(50)     null,                      --업로드파일명
    fileSize    number            default 0,                      --파일사이즈 
    downCount    number     default 0,            --다운수
    originalFileName    varchar2(150)     null               --변경전 파일명	
);

drop sequence reboard_seq;
create sequence reboard_seq
increment by 1
start with 1
nocache;

select * from reboard order by no desc;

write.jsp

<%@page import="java.sql.SQLException"%>
<%@page import="com.herbmall.reboard.model.ReBoardDAO"%>
<%@page import="com.herbmall.reboard.model.ReBoardVO"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
	//[1] 글쓰기 :  list.jsp에서 [글쓰기]클릭하면 get방식으로 이동 
	//[2] 답변화면 : detail.jsp에서 [답변]클릭하면 get방식으로 이동
	//1
	String no=request.getParameter("no");
	
	ReBoardVO vo=null;	
	boolean isReply=false;
	String url="", btLabel="";
	if(no!=null && !no.isEmpty()){
		isReply=true; //답변화면
		url="reply_ok.jsp";
		btLabel="답변";
		
		//2
		ReBoardDAO dao=new ReBoardDAO();
		try{
			vo=dao.selectByNo(Integer.parseInt(no));	
		}catch(SQLException e){
			e.printStackTrace();
		}
	}else{
		url="write_ok.jsp";
		btLabel="등록";		
	}
	
	//3
%>    
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../css/mainstyle.css" />
<link rel="stylesheet" type="text/css" href="../css/clear.css" />
<link rel="stylesheet" type="text/css" href="../css/formLayout.css" />
<link rel="stylesheet" type="text/css" href="../css/mystyle.css" />

<title>답변형게시판 
<%if(isReply){ %>
	답변하기
<%}else{ %>
	글쓰기
<%} %>
 - 허브몰</title>
<script type="text/javascript" src="../js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
	$(function(){
		$('#btList').click(function(){
			location.href = 'list.jsp';
		});
		
		$('form[name=frmWrite]').submit(function(){
			$('.infobox').each(function(idx, item){
				if($.trim($(this).val()).length<1){
					alert($(this).prev().text() + '을(를) 입력하세요');
					$(item).focus();
					event.preventDefault();
					return false;  //each 탈출
				}
			});			
		});
		
	});
</script>

</head>
<body>
<div class="divForm">
<form name="frmWrite" method="post" action="write_ok.jsp" 
		encType="multipart/form-data" >
	<%if(isReply){ %>
		<input type="text" name="groupNo" value="<%=vo.getGroupNo()%>">
		<input type="text" name="step" value="<%=vo.getStep()%>">
		<input type="text" name="sortNo" value="<%=vo.getSortNo()%>">
	<%} %>
 <fieldset>
	<legend><%if(isReply){ %>
				답변하기
			<%}else{ %>
				글쓰기
			<%} %>
	</legend>
        <div class="firstDiv">
            <label for="title">제목</label>
            <input type="text" id="title" name="title" class="infobox" 
            	<%if(isReply){ %>
					value="Re : <%=vo.getTitle() %>"
				<%} %>
            />
        </div>
        <div>
            <label for="name">작성자</label>
            <input type="text" id="name" name="name" class="infobox"/>
        </div>
        <div>
            <label for="pwd">비밀번호</label>
            <input type="password" id="pwd" name="pwd" class="infobox"/>
        </div>
        <div>
            <label for="email">이메일</label>
            <input type="text" id="email" name="email" />
        </div>
        <div>  
        	<label for="content">내용</label>        
 			<textarea id="content" name="content" rows="12" cols="40"></textarea>
        </div>
        <div>
            <label for="upfile">첨부파일</label>
            <input type="file" id="upfile" name="upfile" /><span>(최대 2M)</span>
        </div>
        <div class="center">
            <input type = "submit" value="<%=btLabel%>"/>
            <input type = "Button" value="글목록" id="btList"/>         
        </div>
    </fieldset>
</form>
</div>   
<form name="frm1" method="post" action="upload_ok.jsp" enctype="multipart/form-data" >
	아이디 : <input type="text" name="id"><br>
	파일 업로드 : <input type="file" name="fileName" size="30"><br>
	<input type = "submit" value="등록"><br>
</form>

              
</body>
</html>

write_ok.jsp

<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.herbmall.common.Utility"%>
<%@page import="java.io.IOException"%>
<%@page import="com.herbmall.reboard.model.ReBoardVO"%>
<%@page import="java.sql.SQLException"%>
<%@page import="com.herbmall.reboard.model.ReBoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>write_ok.jsp</title>
</head>
<body>
<%
	try{
		String upDir = Utility.UPLOAD_PATH;
		
		String saveDir = application.getRealPath(upDir);
		System.out.println("saveDir = "+saveDir);
		
		saveDir = config.getServletContext().getRealPath(upDir);
		System.out.println("saveDir = "+saveDir);
		
		saveDir = Utility.TEST_PATH;
		System.out.println("testDir = "+saveDir);
		
		int maxSize = 2*1024*1024;
		String encoding = "utf-8";
		
		DefaultFileRenamePolicy policy = new DefaultFileRenamePolicy();
		
		MultipartRequest mr = new MultipartRequest(request, saveDir, maxSize, encoding, policy);
		
		String fileName = mr.getFilesystemName("upfile");
		long fileSize=0;
		String originFileName = "";
		if(fileName!=null && !fileName.isEmpty()){
			File f = mr.getFile("upfile");
			fileSize=f.length();
			
			originFileName = (String)mr.getOriginalFileName("upfile");
		}
		//write.jsp에서 post방식으로 서브밋됨	
		//1
		
		String title=mr.getParameter("title");
		String name=mr.getParameter("name");
		String pwd=mr.getParameter("pwd");
		String email=mr.getParameter("email");
		String content=mr.getParameter("content");
		
		//ip 읽어오기
		String ip=request.getRemoteAddr();
		System.out.println("ip="+ip);
		
		ip=request.getRemoteHost();
		System.out.println("ip="+ip);
		
		//2
		ReBoardDAO dao = new ReBoardDAO();
		ReBoardVO vo = new ReBoardVO();
		vo.setContent(content);
		vo.setEmail(email);
		vo.setName(name);
		vo.setPwd(pwd);
		vo.setTitle(title);
		vo.setFileName(fileName);
		vo.setOriginalFileName(originFileName);
		vo.setFileSize(fileSize);
	
	
		int cnt=dao.insertReBoard(vo);
		
		//3
		if(cnt>0){ %>
			<script type="text/javascript">
				alert("글쓰기 성공");
				location.href="list.jsp";
			</script>
		<% }else{ %>
			<script type="text/javascript">
				alert("글쓰기 실패");
				history.back();
			</script>			
		<%}
	}catch(IOException e){
		e.printStackTrace();%>
		<script type="text/javascript">
			alert("2M 이상의 파일은 업로드 불가");
			history.back();
		</script>
	<%
	}catch(SQLException e){
		e.printStackTrace();
	}
	
	
%>
</body>
</html>




6. 파일 다운로드

detail.jsp

<%@page import="com.herbmall.common.Utility"%>
<%@page import="com.herbmall.reboard.model.ReBoardVO"%>
<%@page import="java.sql.SQLException"%>
<%@page import="com.herbmall.reboard.model.ReBoardDAO"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
	//list.jsp에서 get방식으로 이동
	//=> http://192.168.0.100:9090/herbmall/reBoard/detail.jsp?no=2
	//1
	String no=request.getParameter("no");
	if(no==null || no.isEmpty()){ %>
		<script type="text/javascript">
			alert('잘못된 url입니다.');
			location.href="list.jsp";
		</script>
		
	<%	return;
	}
	
	//2
	ReBoardDAO dao=new ReBoardDAO();
	ReBoardVO vo=null;
	try{
		vo=dao.selectByNo(Integer.parseInt(no));	
	}catch(SQLException e){
		e.printStackTrace();
	}
	
	//3
	String content=vo.getContent();
	if(content!=null && !content.isEmpty()){
		content=content.replace("\r\n", "<br>");
	}else{
		content="";
	}
	String fileInfo = "";
	String downInfo="";
	if(vo.getFileName()!=null && !vo.getFileName().isEmpty()){
		
		fileInfo=Utility.getFileInfo(vo);
		downInfo=" 다운 : "+vo.getDownCount();
	}
%>    
<!DOCTYPE HTML>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>답변형게시판 상세보기 - 허브몰</title>
<link rel="stylesheet" type="text/css" href="../css/mainstyle.css" />
<link rel="stylesheet" type="text/css" href="../css/clear.css" />
<link rel="stylesheet" type="text/css" href="../css/formLayout.css" />
<link rel="stylesheet" type="text/css" href="../css/mystyle.css" />
<style type="text/css">
	body{
		padding:5px;
		margin:5px;
	 }
	.divForm {
		width: 500px;
		}
</style>  
</head>
<body>
	<h2>글 상세보기</h2>
	<div class="divForm">
		<div class="firstDiv">
			<span class="sp1">제목</span> <span><%=vo.getTitle() %></span>
		</div>
		<div>
			<span class="sp1">작성자</span> <span><%=vo.getName() %></span>
		</div>
		<div>
			<span class="sp1">등록일</span> <span><%=vo.getRegdate() %></span>
		</div>
		<div>
			<span class="sp1">조회수</span> <span><%=vo.getReadcount() %></span>
		</div>
		<div>
			<span class="sp1">첨부파일</span> 
				
			<span><a href="downCount.jsp?no=<%=no%>&fileName=<%=vo.getFileName() %>"><%=fileInfo%> </a></span>
			<span><%=downInfo%></span>
		</div>
		<div class="lastDiv">			
			<p class="content"><%=content %></p>
		</div>
		<div class="center">
			<a href='edit.jsp?no=<%=no%>'>수정</a> |
        	<a href='delete.jsp?no=<%=no%>&groupNo=<%=vo.getGroupNo()%>&step=<%=vo.getStep()%>'>
        	삭제</a> | 
        	<a href='write.jsp?no=<%=no%>'>답변</a> |
        	<a href='list.jsp'>목록</a>			
		</div>
	</div>

	
</body>
</html>

downcount.jsp

<%@page import="java.io.BufferedOutputStream"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.BufferedInputStream"%>
<%@page import="java.io.File"%>
<%@page import="com.herbmall.common.Utility"%>
<%@page import="java.sql.SQLException"%>
<%@page import="com.herbmall.reboard.model.ReBoardDAO"%>
<%@page import="com.herbmall.reboard.model.ReBoardVO"%>
<%@page import="com.herbmall.board.model.BoardVO"%>
<%@page import="com.herbmall.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	//다운로드 수 증가
	String no = request.getParameter("no");
	String fileName = request.getParameter("fileName");
	
	ReBoardDAO dao = new ReBoardDAO();
	ReBoardVO vo = dao.selectByNo(Integer.parseInt(no));
	
	BufferedInputStream bis = null;
	
	BufferedOutputStream bos = null;
	
	
	try{		
		int cnt = dao.updateDownCount(Integer.parseInt(no));
		
		//파일 다운로드 처리
		//page의 설정을 바꾸기 위해 response를 날린다
		response.reset();
		
		//setContentType은 MIME 타입을 지정-octet-stream으로 지정시,
		//형식을 지정하지 않겠다는 것
		response.setContentType("application/octet-stream");
		
		//브라우저 파일 확장자를 포함하여 모든 확장자의 파일들에 대해 다룬로드 시 무조건
		//파일 다운로드 대화상자가 뜨도록 하는 헤더 속성
		response.setHeader("Content-Disposition", "attachment;filename="
         + new String(fileName.getBytes("euc-kr"), "ISO-8859-1"));

		//url 전송 시 ISO-8859-1로 인코딩되므로 한글 처리를 위해 인코딩
		
		out.clear();
    	out=pageContext.pushBody();

		//생략 시 프로그램 상엔 이상이 없으나 이미 존재하고 있는 out객체로
		//바이트 기반의 스트림 작업을 명시하면서 오류 발생
		
		
		String path = application.getRealPath(Utility.UPLOAD_PATH); //UPLOAD_PATH = "pds_upload"; 
		path=Utility.TEST_PATH; //TEST_PATH = "C:\\lecture\\workspace.list\\jsp_ws\\herbmall\\src\\main\\webapp\\pds_upload";
		
		File file = new File(path,fileName);
		
		byte[] data = new byte[1024*1024];
		bis = new BufferedInputStream(new FileInputStream(file));
		
		bos = new BufferedOutputStream(response.getOutputStream());
		
		int count = 0;
		while((count=bis.read(data))!=-1){
			bos.write(data);
		}
		
		
	}catch(SQLException e){
		e.printStackTrace();
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		if(bis!=null) bis.close();
		if(bos!=null) bos.close();
	}

%>
</body>
</html>

7. 삭제

delete.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    
<!DOCTYPE HTML>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>답변형게시판  삭제 - 허브몰</title>
<link rel="stylesheet" type="text/css" href="../css/mainstyle.css" />
<link rel="stylesheet" type="text/css" href="../css/clear.css" />
<link rel="stylesheet" type="text/css" href="../css/formLayout.css" />
<link rel="stylesheet" type="text/css" href="../css/mystyle.css" />
<style type="text/css">
	body{
		padding:5px;
		margin:5px;
	 }
	.divForm{
		width:650px;
		border:1px solid #ddd;		
	}
	/* .divForm form{
		width:650px;
	} */
	.divForm div	{
		/* clear: both; */
		border:none;
		padding: 7px 0;
		margin: 0;
		overflow: auto;
	}	
	.sp{
		font-size:0.9em;
		color:#0056AC;			
	}
	.divForm fieldset	{
		border:0;
	}
</style>
<%
	//1
	String no=request.getParameter("no");
	if(no==null || no.isEmpty()){ %>
		<script type="text/javascript">
			alert('잘못된 url입니다.');
			location.href="list.jsp";
		</script>
		
	<%	return;
	}
	
	String groupNo=request.getParameter("groupNo");
	String step=request.getParameter("step");
	String fileName = request.getParameter("fileName");
	   
	//2
	//3
%>
<script type="text/javascript" src="../js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
	$(function(){
		$('form[name=frmDelete]').submit(function(){
			if(confirm('삭제하시겠습니까?')){
				if($.trim($('#pwd').val()).length<1){
					alert('비번 입력!!');
					$('#pwd').focus();
					event.preventDefault();
				}
			}else{
				event.preventDefault();
			}
		});
	});
	
</script>
</head>
<body>
<div class="divForm">
<form name="frmDelete" method="post"	action="delete_ok.jsp" >
	<input type="text" name="no" value="<%=no %>" />
	<input type="text" name="groupNo" value="<%=groupNo %>" />
   <input type="text" name="step" value="<%=step %>" />
	<!-- 삭제 처리시 필요한 no를 hidden 필드에 넣어준다 --> 
   <input type="text" name="fileName" value="<%=fileName %>" />
   
		<fieldset>
		<legend>글 삭제</legend>
	        <div>           
	        	<span class="sp"><%=no %> 번 글을 삭제하시겠습니까?</span>                        
	        </div>
	        <div>           
	            <label for="pwd">비밀번호</label>
	            <input type="password" id="pwd" name="pwd" />   
	        </div>
	        <div class="center">
	            <input type ="submit"  value="삭제" />
	            <input type = "Button" value="글목록" 
                	OnClick="location.href='list.jsp'" />
	        </div>
	    </fieldset>
    </form>
</div>

</body>
</html>

delete_ok.jsp

<%@page import="java.io.File"%>
<%@page import="com.herbmall.common.Utility"%>
<%@page import="javax.swing.JTree.DynamicUtilTreeNode"%>
<%@page import="com.herbmall.reboard.model.ReBoardVO"%>
<%@page import="java.sql.SQLException"%>
<%@page import="com.herbmall.reboard.model.ReBoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
	//delete.jsp에서 post방식으로 이동
	//1
	request.setCharacterEncoding("utf-8");
	String no = request.getParameter("no");
	String pwd = request.getParameter("pwd");
	String groupNo = request.getParameter("groupNo");
	String step = request.getParameter("step");
	String fileName = request.getParameter("fileName");
	String saveDir = Utility.TEST_PATH;

	//2
	ReBoardDAO dao = new ReBoardDAO();
	ReBoardVO vo = new ReBoardVO();
	vo.setNo(Integer.parseInt(no));
	vo.setGroupNo(Integer.parseInt(groupNo));
	vo.setStep(Integer.parseInt(step));

	try {
		//[1]비밀번호 체크
		if(dao.checkPwd(Integer.parseInt(no), pwd)){
			//[2]삭제
			dao.deleteReBoard(vo);
			if(fileName!=null && !fileName.isEmpty()){
	            File file=new File(saveDir, fileName);
	            if(file.exists()){
	               boolean bool=file.delete();
	               System.out.println("업로드된 파일 삭제:"+bool);
	            }
	         }%>
		%>
			<script type="text/javascript">
				alert("삭제 성공");
				location.href = "list.jsp";
			</script>
	<%  }else{ %>
			<script type="text/javascript">
				alert("비번 불일치!");
				history.back();
			</script>			
	<%	} //if
	} catch (SQLException e) {
		e.printStackTrace();
	}
	%>
</body>
</html>