JSP 파일 업로드 및 파일 다운로드 프로그램 예제

이번 예제에서는 JSP를 통해 파일을 업로드하고 다운로드하는 방법을 알아보겠습니다.

파일 입력 출력은 매우 중요한 작업입니다. 여기서는 JSP를 사용하여 파일을 읽고 쓰겠습니다.

JSP 파일 업로드

  • JSP를 사용하여 모든 파일을 업로드할 수 있습니다.
  • 텍스트 파일, 바이너리 파일, 이미지 파일 또는 기타 문서일 수 있습니다.
  • 여기서 파일 업로드의 경우 GET 방식이 아닌 POST 방식만 사용됩니다.
  • Enctype 속성은 multipart/form-data로 설정되어야 합니다.

예: 작업 사용

이 예에서는 IO 객체를 사용하여 파일을 업로드합니다.

Action_file.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

Action_file_upload.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   String filePath = "E:/guru99/data";

   String contentType = request.getContentType();
   if ((contentType.indexOf("multipart/form-data") >= 0)) {

      DiskFileItemFactory factory = new DiskFileItemFactory();
      factory.setSizeThreshold(maxMemSize);
      factory.setRepository(new File("c:\\temp"));
      ServletFileUpload upload = new ServletFileUpload(factory);
      upload.setSizeMax( maxFileSize );
      try{ 
         List fileItems = upload.parseRequest(request);
         Iterator i = fileItems.iterator();
         out.println("<html>");
         out.println("<body>");
         while ( i.hasNext () ) 
         {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () )  {
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                file = new File( filePath + "yourFileName") ;
                fi.write( file ) ;
                out.println("Uploaded Filename: " + filePath + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      }catch(Exception ex) {
         System.out.println(ex);
      }
   }else{
      out.println("<html>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>");
      out.println("</html>");
   }
%>
</body>
</html>

코드 설명:

Action_file.jsp

코드 라인 12-18: 여기서는 서버에 파일을 업로드하고 작업이 action_file_upload.jsp로 전달되는 파일 필드가 있는 양식을 생성합니다.

Action_file_upload.jsp

코드 라인 20: 여기서는 특정 경로에 대한 파일 경로를 제공합니다.

코드 라인 23-38: 여기서는 콘텐츠 유형이 multipart/form-data인지 확인합니다. 이 경우 콘텐츠는 파일 형식이며 읽혀집니다. 파일을 읽은 후 임시 파일에 쓴 다음 임시 파일을 기본 파일로 변환합니다.

위의 코드를 실행하면 다음과 같은 결과가 나옵니다.wing 출력

JSP 파일 업로드

출력:

파일 선택 버튼 옵션을 사용하여 파일을 업로드하고 있으며 파일 업로드 버튼을 사용하면 제공된 경로의 서버에 파일이 업로드됩니다.

예: JSP 작업 사용

이 예에서는 JSP 작업을 사용하여 파일을 업로드하겠습니다.

“업로드” 버튼이 있는 양식을 선택하고 업로드 버튼을 클릭하면 파일이 업로드됩니다.

Uploading_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
                        enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>

코드 설명:

코드 라인 11-12: 여기서는 POST 메소드를 통과하는 서블릿 guru_upload에 대한 조치가 있는 양식을 사용합니다. 또한 여기서는 양식 데이터를 인코딩하여 서버로 전송하는 방법을 지정하는 속성을 enctype하며 이는 POST 메서드에서만 사용됩니다. 여기서는 파일용(데이터가 크기 때문에) multipart/form-data로 설정합니다.

코드 라인 13: 여기서는 파일 유형으로 guru_file 요소를 지정하고 크기를 50으로 지정합니다.

코드 라인 15: 이는 작업 서블릿이 호출되고 요청이 처리되며 파일을 읽고 서블릿에 쓰는 "업로드"라는 이름의 제출 유형 버튼입니다.

Guru_upload.java

package demotest;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class guru_upload extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
    public guru_upload() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        if(ServletFileUpload.isMultipartContent(request)){
		            try {
		                List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
		                for(FileItem item : multiparts){
		                    if(!item.isFormField()){
		                        String name = new File(item.getName()).getName();
		                        item.write( new File("c:/guru/upload" + File.separator + name));
		                    }
		                }
		               //File uploaded successfully
		               request.setAttribute("gurumessage", "File Uploaded Successfully");
		            } catch (Exception ex) {
		               request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
		            }         		
		        }else{
		
		            request.setAttribute("gurumessage","No File found");
 }
		        request.getRequestDispatcher("/result.jsp").forward(request, response);
		
		    }


}

코드 설명:

코드 라인 12-14: 여기서는 org.apache.commons 라이브러리를 코드 구성으로 가져와야 합니다. org.apache.commons 라이브러리에서 fileupload 클래스를 가져와야 합니다.

코드 라인 23: 여기에는 JSP에서 POST 메소드를 전달할 때 호출되는 doPost() 메소드가 있으며 매개변수로 객체를 요청하고 응답합니다.

코드 라인 26: 여기서는 JSP에 파일 객체가 있는지 확인하는 org.apache.commons 라이브러리의 fileUpload 패키지에서 ServletFileUpload 클래스 객체를 생성합니다. 발견된 경우 해당 파일 객체가 요청에서 가져옵니다.

코드 라인 27-32: 목록 객체인 multiparts 객체에 존재하는 파일 항목 수를 확인하여(두 개 이상의 파일을 업로드하는 경우) 파일 수를 반복하고 제공된 파일 이름으로 c:/guru/upload 폴더에 저장합니다. . 앞서 언급한 폴더에 fileobject의 write 메소드를 사용하여 파일을 쓰고 있습니다.

코드 라인 34: 예외가 없으면 요청의 속성을 "파일이 성공적으로 업로드되었습니다" 값을 갖는 gurumessage로 설정합니다.

코드 라인 35-36: 예외가 발생하면 "파일 업로드 실패"라는 메시지를 설정합니다.

코드 라인 40: 파일을 찾을 수 없으면 메시지를 "파일을 찾을 수 없음"으로 설정합니다.

코드 라인 42: requestdispatcher 객체를 사용하여 요청 및 응답 객체가 있는 result.jsp로 요청을 전달합니다.

결과.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
   out.println(msg);
%>
</body>
</html>

코드 설명:

코드 라인 10: 여기서는 gurumessage 값을 가진 요청 객체의 속성을 문자열 객체로 가져옵니다.

코드 라인11: 여기서 우리는 그 메시지를 인쇄하고 있습니다.

위 코드를 실행하면 다음과 같은 결과가 나옵니다.wing 출력

출력:

디렉토리에서 파일을 선택할 수 있는 필드가 있는 양식을 얻습니다. 파일이 선택되면 업로드 버튼을 클릭해야 합니다.

JSP 작업을 사용한 파일 업로드

업로드 버튼을 클릭하면 파일이 성공적으로 업로드되었다는 메시지가 나타납니다.

JSP 작업을 사용한 파일 업로드

아래 다이어그램에서 파일이 c:/guru/upload 폴더에 업로드된 것을 볼 수 있습니다.

JSP 작업을 사용한 파일 업로드

파일 다운로드 중

이 예에서는 버튼을 클릭하여 디렉터리에서 파일을 다운로드하겠습니다.

Download_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>

코드 설명:

코드 라인 10: 여기서는 서블릿 guru_download 를 사용하여 c:/guru/upload 폴더에서 파일을 다운로드할 수 있는 링크를 제공했습니다.

Guru_download.java

package demotest;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class guru_download
 */
public class guru_download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String gurufile = "test.txt";
		String gurupath = "c:/guru/upload/";
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ gurufile + "\"");
 
		FileInputStream fileInputStream = new FileInputStream(gurupath
				+ gurufile);
 
		int i;
		while ((i = fileInputStream.read()) != -1) {
			out.write(i);
		}
		fileInputStream.close();
		out.close();
	}


	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

코드 설명:

코드 라인 3-5: 여기서는 java.io 패키지에서 FileInputStream, IO Exception 및 PrintWriter를 가져옵니다.

코드 라인 15: 우리는 guru_download를 정의하고 있습니다 서블릿 이는 HttpServlet을 확장합니다.

코드 라인 18: URL에 포함될 href를 정의했으므로 GET 메소드가 처리되고(doGet은 서블릿에서 호출됨) 요청 및 응답 객체도 포함됩니다.

코드 라인 19-20: 응답 개체에 콘텐츠 유형을 설정하고 응답에서 작성자 개체도 가져옵니다.

코드 라인 21-22: 변수를 test.txt 값으로 gurufile로 정의하고 c:/guru/upload/로 gurupath를 정의합니다.

코드 라인 23-25: 응답 객체를 사용하여 콘텐츠 유형을 설정하고 업로드된 파일 이름으로 응답 객체에 헤더를 설정하는 setHeader 메소드를 사용합니다.

코드 라인 27-28: gurupath+gurufile을 추가할 FileInputStream을 생성 중입니다.

코드 라인 31-33: 여기서 우리는 while 루프 파일을 읽을 때까지 실행되므로 조건은 != -1로 지정됩니다. 이 조건에서 우리는 printwriter 객체 출력을 사용하여 쓰고 있습니다.

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.wing 출력

출력:

파일 다운로드 중

출력:

downloading_1.jsp를 클릭하면 “Download Here”라는 하이퍼링크가 표시됩니다. 이 하이퍼링크 파일을 클릭하면 시스템에 다운로드됩니다.

요약

  • 우리는 모든 애플리케이션에 등록하기 위한 등록 양식에 대해 배웠습니다.
  • 로그인 및 로그아웃 양식의 작동 방식에 대해 자세히 알아보세요.
  • 또한 다음을 통해 파일을 업로드하고 다운로드하는 방법도 배웠습니다. JSP.