Datebase

JSP 파일 업로드 기능 구현 방법들

엘호리스 2018. 2. 8. 15:19

COS 라이브러리


http://www.servlets.com/cos/


1. 접속후에 cos-26Dec2008.zip 파일 다운로드





2-1. 압축파일 풀고 tomcat 라이브러리 폴더에 복사한다.

2-2. 만약 특정 웹 프로젝트에만 사용할려면 WEB-INF 폴더 안 lib 폴더에 cos.jar파일을 복사한다.




참고할 예제

uploadForm.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <h2>파일 업로드</h2>
  <form action="upload.jsp" method="POST" enctype="multipart/form-data" >
    <label>설명</label><input type="text" name="comment" /><br> 
    <input type="file" name="file1" /><br>
    <input type="file" name="file2" /><br>
    <input type="submit" value="전송" />
  </form>  
</body>
</html>
cs


upload.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<%@page import="java.util.Enumeration"%>
<%@page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
    
<%
    MultipartRequest multi = null;
    String savepath = request.getRealPath("upload");
    // WebContent 폴더에 upload 폴더를 생성하고 실행할 것
    // D:\ws\jsp\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\TestPrj16\"upload"
    System.out.println(savepath);
    int limitSize = 15 * 1024 * 1024 ; // 최대 Upload 크기 15M byte
    
    String comment      = "";
    String filename1    = "";
    String orgFileName1 = "";
    String filename2    = "";
    String orgFileName2 = "";
    try {
        multi = new MultipartRequest(request,  // 일반 request (text) 정보 
            savepath,    // 업로드된 파일의 저장 경로
            limitSize,   // 파일 최대 크기 제한
            "utf-8",     // encoding
            new DefaultFileRenamePolicy()); // 중복파일 처리
        comment = multi.getParameter("comment");
        // comment = request.getParameter("comment"); // null
        // 이유는 request를 MultipartRequest() 가 가로챈다
        
        // 여러파일 처리
        Enumeration files = multi.getFileNames();
        
        String file1 = (String) files.nextElement();
        filename1    = multi.getFilesystemName(file1);
        orgFileName1 = multi.getOriginalFileName(file1);
        
        String file2 = (String) files.nextElement();
        filename2    = multi.getFilesystemName(file2);
        orgFileName2 = multi.getOriginalFileName(file2);
            
    } catch (Exception e) {
        e.printStackTrace();
    }            
    
%>    
<h2>넘어온 파일 정보</h2>
<p>설명:<%=comment %></p>
<p>실제 파일명1:<%=filename1 %> 
  <a href="file_down.jsp?fn=<%=filename1 %>">
  <%=orgFileName1 %>다운로드</a></p>
<p>원본 파일명1:<%=orgFileName1 %></p>
 
<p>실제 파일명2:<%=filename2 %> 
  <a href="file_down.jsp?fn=<%=filename2 %>">
  <%=orgFileName2 %>다운로드</a></p>
<p>원본 파일명2:<%=orgFileName2 %></p>
cs


file_down.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.File"%>
<%@page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
  request.setCharacterEncoding("utf-8"); // 한글처리(POST)
    String fn = request.getParameter("fn");
    System.out.println(fn);
    
    String         savepath = "upload";
    ServletContext context  = this.getServletContext();
    String sDownloadPath    = context.getRealPath(savepath);
    String sFilePath        = sDownloadPath + "\\" + fn;
    
    byte [] b = new byte[4096];
    File oFile = new File(sFilePath);
    
    FileInputStream fis = new FileInputStream(oFile);
    
    String sMimeType = getServletContext().getMimeType(sFilePath);
    System.out.println("MimeType: " +  sMimeType); 
    
    if( sMimeType == null ) sMimeType = "application/octet-stream";
    response.setContentType(sMimeType);
    
    // 한글 파일명 깨지는 것 방지
    String sEncoding = new String(fn.getBytes("utf-8"), "8859_1");
    // 이부분이 모든 파일 링크를 클릭했을 때 
    //   다운로드 화면이 출력되게 처리하는 부분
    response.setHeader("Content-Disposition"
        "attachment; filename=" + sEncoding);
    
    ServletOutputStream out2 = response.getOutputStream();
    int numRead;
    
    while((numRead = fis.read(b, 0, b.length))!= -1) {
        out2.write(b, 0, numRead);
    }
    out2.flush();
    out2.close();
    fis.close();    
  // 한글 파일이 다운로드 되지 않으면 \
  // server.xml : 
  //  <Connector /> 태그에 URIEncoding="utf-8" 추가하면된다
%>
cs