2021.01.07 일지

0후·2021년 1월 7일
0

비트캠프

목록 보기
57/112

File

  1. file 기능을 사용하려면 해당 사이트에서 다운 받아서 압축 풀고 lib 파일을 WebContent에 넣어둔다.
  2. controller를 건드리기 전에 file.mvc.model 내 FileSet.java를 생성해준다.
package file.mvc.model;

public class FileSet {
	public final static String FILE_DIR = "로컬폴더주소";
}
  1. file.mvc.control 패키지 내 FileController.java를 생성해준다.
package file.mvc.control;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import file.mvc.model.FileSet;

@WebServlet("/file/file.do")
public class FileController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private String m="";
	public void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		m = request.getParameter("m");
		if(m != null) {
			m = m.trim();
			switch(m) {
				case "form": form(request, response); break; 
				case "upload": upload(request, response); break; 
				case "list": list(request, response); break;
				case "del": del(request, response); break;
				case "download": download(request, response); break;
				default: list(request, response); break;
			}
		}else {
			list(request, response);
		}
	}
	
	public void form(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String view = "form.jsp";
		response.sendRedirect(view);
	}
	public void upload(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		File fSaveDir = new File(FileSet.FILE_DIR);
		if(!fSaveDir.exists()) fSaveDir.mkdirs();
		
		MultipartRequest mr = new MultipartRequest(request,
                FileSet.FILE_DIR,
                1*1024*1024,
                "utf-8",
                new DefaultFileRenamePolicy());
		
		String writer = mr.getParameter("writer");
		String fname = mr.getFilesystemName("fname");
		String ofname =mr.getOriginalFileName("fname");
		System.out.println(
			"# writer: "+ writer + ", fname: "+fname+", ofname: " + ofname);
		
		String view = "file.do";
		response.sendRedirect(view);
	}
	public void list(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		File f = new File(FileSet.FILE_DIR);
		File kids[] = f.listFiles();
	    ArrayList<File> fList = new ArrayList<File>();
	    for(File kid: kids) fList.add(kid);
		request.setAttribute("fList", fList);
		
		String view = "list.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(view);
		rd.forward(request, response);
	}
	public void del(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String fname =request.getParameter("fname");
		if(fname != null) fname = fname.trim();
		File f = new File(FileSet.FILE_DIR, fname);
		if(f.exists()) f.delete();
		
		String view = "file.do";
		response.sendRedirect(view);
	}
	public void download(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String fname = new String(request.getParameter("fname"));
		File file = new File(FileSet.FILE_DIR +"/"+fname);

		response.setContentType("application/octet-stream"); 

		String Agent=request.getHeader("USER-AGENT");
		if( Agent.indexOf("MSIE") >= 0 ){
			int i = Agent.indexOf( 'M', 2 );

			String IEV = Agent.substring( i + 5, i + 8 );

			if( IEV.equalsIgnoreCase("5.5") ){
				response.setHeader("Content-Disposition", "filename=" + new String(fname.getBytes("utf-8"), "8859_1") );
			}else{
				response.setHeader("Content-Disposition", "attachment;filename="+new String(fname.getBytes("utf-8"),"8859_1"));
			}
		}else{
			response.setHeader("Content-Disposition", "attachment;filename=" + new String(fname.getBytes("utf-8"), "8859_1") );
		}

		byte b[] = new byte[1024];
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		OutputStream os = null;
		BufferedOutputStream bos = null;
		
		if( file.isFile()){ 
			try{ 
				fis = new FileInputStream(file);//Node 
				bis = new BufferedInputStream(fis); //Filter 
				
				os = response.getOutputStream(); //Node
				bos = new BufferedOutputStream(os); //Filter   

				int read = 0;

				while( ( read = bis.read( b ) ) != -1 ){  
					bos.write(b,0,read);
				}
				bos.flush();
			}catch( Exception e ){
			}finally {
				try {
					if(bis != null) bis.close();
					if(bos != null) bos.close();
					if(fis != null) fis.close();
					if(os != null) os.close();
				}catch(IOException ie) {}
			}
		}
	}
}
  1. file을 업로드 해 줄 view가 필요하므로, form.jsp를 생성해서 만들어준다.
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>File Upload Form</title>
</head>
<body>
<center>
    <h2>File Upload Form</h2>
    <form name="f" method="post" action="file.do?m=upload" enctype="multipart/form-data">
        유져: <input type="text" name="writer" size="32"><br/>
        파일: <input type="file" name="fname"><br/><br/>
        <input type="submit" value="전송">
    </form>
</center>
</body>
</html>
  1. 파일이 있을 경우와 없을 경우를 나눠서 리스트를 뽑아주는 list.jsp를 생성해주면 끝!
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<meta charset='utf-8'>
<center>
	<h1>
		File List MVC  
	</h1>
	<table border='1' cellpadding='7' cellspacing='2' width='50%'>
	    <tr>
		    <th>파일이름</th>
		    <th>파일크기</th>
			<th>삭제</th>
		</tr>
		<c:if test="${fList.size() == 0}">
		    <tr>
			    <td align="center" colspan="3">파일 없음</td>
			</tr>
		</c:if>
		<c:forEach items="${fList}" var="kid">
	        <tr>
			    <td align="center">
			        <a href="file.do?m=download&fname=${kid.name}">${kid.name}</a>
			    </td>
			    <td align="center">${kid.length()}</td>
				<td align="center"><a href="file.do?m=del&fname=${kid.name}">삭제</a></td>
			</tr>
		</c:forEach>
    </table>
    <br/>
    <a href="file.do?m=form">업로드 폼</a>
    &nbsp;&nbsp;&nbsp;
    <a href="../index.do">인덱스</a>
</center>

파일 내 세부적인 메소드의 한 줄 한 줄이 어떤 역할을 하는지는 모르겠다. 앞으로 더 연구해보아야 할 연구대상이다. 일단은 이렇게 해서 사용한다는 것을 알아두기만 하면 나중에 잘 사용할 수 있을 것 같다.

profile
휘발방지

0개의 댓글