-
23. 파일 업로드 다운로드개발자 수업/JSP 2021. 12. 16. 16:35
1. 라이브러리 추가하기
1) Apache Commons FileUpload, Apache Commons IO
2) com.oreilly.servlet 라이브러리
2. JSP에서 파일 업로드
1) 파일 업로드 관련 API
- DiskFileItemFactory
- setRepository() : 파일을 저장할 디렉토리 설정함
- setSizeThreadhold() : 최대 업로드 가능 파일 크기 설정함
- ServletFileUpload
- parseRequest() : 전송된 매개변수를 List객체로 얻음
- getItemIterator() : 전송된 매개변수를 Iterator 타입으로 얻음
3. 순서
1) 라이브러리 추가
2) 파일 업로드
- 화면 폼 작성
- 데이터베이스 테이블, 시퀀스 생성
- DTO, DAO 작성
- 연동 완성
3) 파일 다운로드
4. 화면 폼 작성
1) 일반적인 폼과 조금 다른 설정
- method="post"
- enctype 속성
- "application/x-www-form-urlencoded"
- 기본값
- 모든 문자를 서버로 전송하기 전에 인코딩함
- "multipart/form-data"
- 모든 문자를 인코딩하지 않음
- <form> 태그를 통해 파일을 서버로 전송할 때 주로 사용함
- "text/plain"
- 공백문자(space)만 "+" 기호로 변환하고 나머지 문자는 인코딩하지 않음
5. 데이터베이스 테이블, 시퀀스 생성
1) 테이블 정의서
컬럼명 데이터 타입 null 허용 키 기본값 설명
------------------------------------------------------------------------------------------------
idx number N PK 일련번호, 기본키
name varchar2(50) N 작성자
title varchar2(200) N 제목
category varchar2(30) 카테고리
ofile varchar2(100) N 원본파일이름
sfile varchar2(30) N 저장된 파일이름
postdate date N 등록된 날짜
6. DTO, DAO 클래스 생성
7. 파일 업로드 처리
1) MultipartRequest 객체 생성
MultipartRequest mr = new MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding);
String saveDirectory : 파일이 저장될 물리적인 경로
int maxPostSize : 업로드될 파일의 최대 용량
String encoding : 인코딩 방식
2) 새로운 파일명 생성 ("업로드일시.확장자")
3) 파일명 변경
4) 다른 폼 값 처리
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <% request.setCharacterEncoding("utf-8"); %> <c:set var="contextPath" value="${pageContext.request.servletContext.contextPath }"/> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>파일 업로드</title> </head> <body> <!-- enctype의 속성값 multipart/form-data : 모든 문자를 인코딩하지 않음. form 태그를 통해 파일을 서버로 전송할 때 주로 사용 --> <form action="${contextPath }/upload.do" method="post" enctype="multipart/form-data"> 파일1 : <input type="file" name="file1"><br> 파일2 : <input type="file" name="file2"><br> 매개변수1 : <input type="text" name="param1"><br> 매개변수2 : <input type="text" name="param2"><br> 매개변수3 : <input type="text" name="param3"><br> <input type="submit" value="업로드"> </form> </body> </html>
package kr.co.ezenac.fileud; import java.io.File; import java.io.IOException; import java.util.List; 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 org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class FileUpload */ @WebServlet("/upload.do") public class FileUpload extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } public void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String encoding="utf-8"; File currenDirPath = new File("C:\\workspace-jsp\\FileRepo"); //업로드할 파일 경로 지정 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(currenDirPath); //파일 경로 설정 factory.setSizeThreshold(1024*1024); //최대 업로드 파일 크기 설정 ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(request); //request객체에서 매개변수를 List로 가져옴 for(int i=0; i<items.size(); i++) { FileItem fileItem = items.get(i); //파일 업로드창에서 업로드된 항목들을 하나씩 가져옴 if(fileItem.isFormField()) { //폼 필드이면 전송된 매개변수 값을 출력함 System.out.println(fileItem.getFieldName() + " = " + fileItem.getString(encoding)); } else { System.out.println("파라미터명 : " + fileItem.getFieldName()); System.out.println("파일명 : " + fileItem.getName()); System.out.println("파일크기 : " + fileItem.getSize() + "bytes"); if(fileItem.getSize() > 0) { int idx = fileItem.getName().lastIndexOf("\\"); if(idx == -1) { idx = fileItem.getName().lastIndexOf("/"); } String fileName = fileItem.getName().substring(idx + 1); File uploadFile = new File(currenDirPath + "\\" + fileName); fileItem.write(uploadFile); //업로드한 파일 이름으로 저장소에 파일을 업로드함 } } } } catch(Exception e) { System.out.println("파일 업로드 중 오류 발생"); e.printStackTrace(); } } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <% request.setCharacterEncoding("utf-8"); %> <c:set var="contextPath" value="${pageContext.request.servletContext.contextPath }"/> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>파일 업로드</title> </head> <body> <!-- enctype의 속성값 multipart/form-data : 모든 문자를 인코딩하지 않음. form 태그를 통해 파일을 서버로 전송할 때 주로 사용 --> <form action="${contextPath }/upload.do" method="post" enctype="multipart/form-data"> 파일1 : <input type="file" name="file1"><br> 파일2 : <input type="file" name="file2"><br> 매개변수1 : <input type="text" name="param1"><br> 매개변수2 : <input type="text" name="param2"><br> 매개변수3 : <input type="text" name="param3"><br> <input type="submit" value="업로드"> </form> </body> </html>
package kr.co.ezenac.fileud; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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 org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class FileUpload */ @WebServlet("/upload.do") public class FileUpload extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } public void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String encoding="utf-8"; File currenDirPath = new File("C:\\workspace-jsp\\FileRepo"); //업로드할 파일 경로 지정 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(currenDirPath); //파일 경로 설정 factory.setSizeThreshold(1024*1024); //최대 업로드 파일 크기 설정 ServletFileUpload upload = new ServletFileUpload(factory); String fileName = null; List<String> fileList = new ArrayList<>(); //업로드할 파일들을 담아놓을 리스트 try { List<FileItem> items = upload.parseRequest(request); //request객체에서 매개변수를 List로 가져옴 for(int i=0; i<items.size(); i++) { FileItem fileItem = items.get(i); //파일 업로드창에서 업로드된 항목들을 하나씩 가져옴 if(fileItem.isFormField()) { //폼 필드이면 전송된 매개변수 값을 출력함 System.out.println(fileItem.getFieldName() + " = " + fileItem.getString(encoding)); } else { System.out.println("파라미터명 : " + fileItem.getFieldName()); System.out.println("파일명 : " + fileItem.getName()); System.out.println("파일크기 : " + fileItem.getSize() + "bytes"); if(fileItem.getSize() > 0) { int idx = fileItem.getName().lastIndexOf("\\"); if(idx == -1) { idx = fileItem.getName().lastIndexOf("/"); } fileName = fileItem.getName().substring(idx + 1); fileList.add(fileName); //복수개 파일들 add File uploadFile = new File(currenDirPath + "\\" + fileName); fileItem.write(uploadFile); //업로드한 파일 이름으로 저장소에 파일을 업로드함 } } } } catch(Exception e) { System.out.println("파일 업로드 중 오류 발생"); e.printStackTrace(); } request.setAttribute("fileList", fileList); //복수 개의 파일들을 request 저장소에 바인딩 RequestDispatcher dispatcher = request.getRequestDispatcher("download/result.jsp"); dispatcher.forward(request, response); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.servletContext.contextPath }"/> <% request.setCharacterEncoding("utf-8"); %> <c:set var="file1" value="${fileList[0] }"/> <c:set var="file2" value="${fileList[1] }"/> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>이미지 파일 출력하기</title> </head> <body> 이미지1 : <c:out value="${file1 }"/><br> 이미지2 : <c:out value="${file2 }"/><br> <c:if test="${not empty file1 }"> <img alt="이미지1" src="${contextPath }/download.do?fileName=${file1}" width="300" height="300"><br> </c:if> <a href="${contextPath }/download.do?fileName=${file1}">파일 내려받기</a> <br> <c:if test="${not empty file2 }"> <img alt="이미지2" src="${contextPath }/download.do?fileName=${file2}" width="300" height="300"><br> </c:if> <a href="${contextPath }/download.do?fileName=${file2}">파일 내려받기</a> <br> </body> </html>
package kr.co.ezenac.fileud; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class FileDownload */ @WebServlet("/download.do") public class FileDownload extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); String fileRepo = "C:\\workspace-jsp\\FileRepo"; String fileName = request.getParameter("fileName"); System.out.println("fileName = " + fileName); OutputStream out = response.getOutputStream(); String downFile = fileRepo + "\\" + fileName; File f = new File(downFile); //파일 다운로드 하기 위해 설정 response.setHeader("Cache-Control", "no-cache"); response.addHeader("Content-disposition", "attachment; fileName=" + fileName); FileInputStream in = new FileInputStream(f); byte[] buffer = new byte[1024 * 8]; while(true) { int count = in.read(buffer); if(count == -1) break; out.write(buffer, 0, count); } in.close(); out.close(); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>파일 업로드</title> <script type="text/javascript"> function validationForm(form) { if(form.name.value == "") { alert("작성자를 입력하세요."); form.name.focus(); return false; } if(form.title.value == "") { alert("제목을 입력하세요."); form.title.focus(); return false; } if(form.attachedFile.value == "") { alert("파일을 첨부하세요."); return false; } } </script> </head> <body> <h3>파일 업로드</h3> <span style="color: red;">${errorMessage }</span> <form action="UploadProcess.jsp" method="post" name="fileForm" enctype="multipart/form-data" onsubmit="return validationForm(this)"> 작성자 : <input type="text" name="name" value="ezen"><br> 제목 : <input type="text" name="title"><br> 카테고리(선택사항) : <input type="checkbox" name="category" value="사진" checked>사진 <input type="checkbox" name="category" value="과제">과제 <input type="checkbox" name="category" value="슬라이드">슬라이드 <input type="checkbox" name="category" value="음원">음원<br> 첨부파일 : <input type="file" name="attachedFile"><br> <input type="submit" value="전송하기"> </form> </body> </html>
package kr.co.ezenac.common; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; public class DBConnPool { public Connection con; public Statement stmt; public PreparedStatement pstmt; public ResultSet rs; //기본 생성자 public DBConnPool() { //커넥션 풀(DataSource) 얻기 try { Context context = new InitialContext(); Context ctx = (Context)context.lookup("java:comp/env"); DataSource source = (DataSource)ctx.lookup("jdbc/oracle"); //커넥션 풀을 통해서 연결 con = source.getConnection(); System.out.println("DB 커넥션 풀 연결 성공"); } catch (Exception e) { System.out.println("DB 커넥션 풀 연결 실패"); e.printStackTrace(); } } //연결 해제 (자원 반납) public void close() { try { if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(pstmt != null) pstmt.close(); if(con != null) con.close(); System.out.println("DB 커녁센 풀 자원 반납 성공"); } catch(Exception e) { System.out.println("DB 커넥션 풀 자원 반납 실패"); e.printStackTrace(); } } }
package kr.co.ezenac.fileupload; /* idx NUMBER PRIMARY KEY, name varchar2(50) NOT NULL, title varchar2(200) NOT NULL, category varchar2(30), ofile varchar2(100) NOT NULL, sfile varchar2(30) NOT NULL, postdate DATE NOT NULL */ public class MyfileDTO { private String idx; private String name; private String title; private String category; private String ofile; private String sfile; private String postdate; public MyfileDTO() { } public String getIdx() { return idx; } public void setIdx(String idx) { this.idx = idx; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getOfile() { return ofile; } public void setOfile(String ofile) { this.ofile = ofile; } public String getSfile() { return sfile; } public void setSfile(String sfile) { this.sfile = sfile; } public String getPostdate() { return postdate; } public void setPostdate(String postdate) { this.postdate = postdate; } }
<%@page import="kr.co.ezenac.fileupload.MyfileDAO"%> <%@page import="kr.co.ezenac.fileupload.MyfileDTO"%> <%@page import="java.io.File"%> <%@page import="java.util.Date"%> <%@page import="java.text.SimpleDateFormat"%> <%@page import="com.oreilly.servlet.MultipartRequest"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String saveDirectory = application.getRealPath("/Uploads"); //저장할 디렉토리 int maxPostSize = 1024 * 1000; //파일 최대 크기(1MB) String encoding = "UTF-8"; //인코딩 방식 try { //MultipartRequest 객체 생성 MultipartRequest mr = new MultipartRequest(request, saveDirectory, maxPostSize, encoding); //새로운 파일명 생성 String filename = mr.getFilesystemName("attachedFile"); //현재 파일 이름 String ext = filename.substring(filename.lastIndexOf(".")); //파일 확장자 String now = new SimpleDateFormat("yyyyMMdd_HmsS").format(new Date()); String newFileName = now + ext; //새로운 파일 이름("업로드일시.확장자") //파일명 변경 //File.separator : 특수기호, 서버 OS에 경로 표시방법 다르기 때문에 환경에 상관없이 동작하게 함 File oldFile = new File(saveDirectory + File.separator + filename); File newFile = new File(saveDirectory + File.separator + newFileName); oldFile.renameTo(newFile); //파일저장시 새로운 파일명으로만 저장 //다른 폼 값 처리 String name = mr.getParameter("name"); String title = mr.getParameter("title"); String[] category = mr.getParameterValues("category"); StringBuffer cateBuf = new StringBuffer(); if(category == null) { cateBuf.append("선택 없음"); } else { for(String s : category) { cateBuf.append(s + ", "); } } //DTO 생성 MyfileDTO dto = new MyfileDTO(); dto.setName(name); dto.setTitle(title); dto.setCategory(cateBuf.toString()); dto.setOfile(filename); dto.setSfile(newFileName); //DAO의 insertFile(dto) MyfileDAO dao = new MyfileDAO(); dao.insertFile(dto); dao.close(); //파일 목록 jsp로 리디렉션 response.sendRedirect("fileList.jsp"); } catch(Exception e) { System.out.println("파일 업로드 에러"); e.printStackTrace(); request.setAttribute("errorMessage", "파일 업로드 에러"); request.getRequestDispatcher("fileUploadMain.jsp").forward(request, response); } %>
package kr.co.ezenac.fileupload; import java.util.ArrayList; import java.util.List; import kr.co.ezenac.common.DBConnPool; public class MyfileDAO extends DBConnPool { //새로운 게시물을 입력 public int insertFile(MyfileDTO dto) { int applyResult = 0; try { String query = "INSERT INTO MYFILE (IDX, NAME, TITLE, CATEGORY, OFILE, SFILE) " + " VALUES (SEQ_MYFILE_IDX.nextval, ?, ?, ?, ?, ?)"; pstmt = con.prepareStatement(query); pstmt.setString(1, dto.getName()); pstmt.setString(2, dto.getTitle()); pstmt.setString(3, dto.getCategory()); pstmt.setString(4, dto.getOfile()); pstmt.setString(5, dto.getSfile()); applyResult = pstmt.executeUpdate(); } catch(Exception e) { System.out.println("insert 중 예외 발생"); e.printStackTrace(); } return applyResult; } //파일 목록을 반환 public List<MyfileDTO> myFileList() { List<MyfileDTO> fileList = new ArrayList<>(); //쿼리문 작성 String query = "SELECT * FROM MYFILE ORDER BY IDX DESC"; try { pstmt = con.prepareStatement(query); //쿼리 준비 rs = pstmt.executeQuery(); while(rs.next()) { //목록 안의 게시물 수만큼 반복 //DTO에 저장 MyfileDTO dto = new MyfileDTO(); dto.setIdx(rs.getString(1)); dto.setName(rs.getString(2)); dto.setTitle(rs.getString(3)); dto.setCategory(rs.getString(4)); dto.setOfile(rs.getString(5)); dto.setSfile(rs.getString(6)); dto.setPostdate(rs.getString(7)); fileList.add(dto); //목록에 추가 } } catch(Exception e) { System.out.println("SELECT시 예외 발생"); e.printStackTrace(); } return fileList; //목록 반환 } }
<%@page import="java.net.URLEncoder"%> <%@page import="kr.co.ezenac.fileupload.MyfileDTO"%> <%@page import="java.util.List"%> <%@page import="kr.co.ezenac.fileupload.MyfileDAO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>DB에 등록된 파일 목록 보기</title> </head> <body> <h2>DB에 등록된 파일 목록 보기</h2> <a href="fileUploadMain.jsp">파일 등록하기</a> <% MyfileDAO dao = new MyfileDAO(); List<MyfileDTO> fileLists = dao.myFileList(); dao.close(); %> <table border="1"> <tr> <th>No</th><th>작성자</th><th>제목</th><th>카테고리</th> <th>원본 파일명</th><th>저장된 파일명</th><th>작성일</th><th></th> </tr> <% for(MyfileDTO f : fileLists) { %> <tr> <td><%=f.getIdx() %></td> <td><%=f.getName() %></td> <td><%=f.getTitle() %></td> <td><%=f.getCategory() %></td> <td><%=f.getOfile() %></td> <td><%=f.getSfile() %></td> <td><%=f.getPostdate() %></td> <td><a href="download.jsp?oName=<%=URLEncoder.encode(f.getOfile(), "utf-8") %>&sName=<%=URLEncoder.encode(f.getSfile(), "utf-8") %>">[다운로드]</a></td> </tr> <% } %> </table> </body> </html>
<%@page import="java.io.OutputStream"%> <%@page import="java.io.FileInputStream"%> <%@page import="java.io.InputStream"%> <%@page import="java.io.File"%> <%@page import="kr.co.ezenac.utils.JSFunction"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String saveDirectory = application.getRealPath("/Uploads"); //저장할 디렉토리 String originalFileName = request.getParameter("oName"); String saveFileName = request.getParameter("sName"); try { //파일 입력스트림 생성 File file = new File(saveDirectory, saveFileName); InputStream inStream = new FileInputStream(file); //한글 파일명 깨짐 방지 String client = request.getHeader("User-Agent"); if(client.indexOf("WOW64") == -1) { //getBytes("UTF-8")로 원본파일명을 바이트 배열로 변환, ISO-8859-1 캐릭터 셋 문자열로 재생성함 originalFileName = new String(originalFileName.getBytes("UTF-8"), "ISO-8859-1"); } else { //인터넷 익스플로러일 경우 getBytes("KSC5601")을 이용하여 바이트 배열로 변환, 문자열로 재생성함 originalFileName = new String(originalFileName.getBytes("KSC5601"), "ISO-8859-1"); } //파일 다운로드용 응답 헤더 초기화 response.reset(); //파일 다운로드 창을 띄우기 위한 콘텐츠 타입 지정 //octet-stream : 8비트 단위의 바이너리 데이터 response.setContentType("application/octet-stream"); //웹 브라우저에서 파일 다운 창이 뜰 때 원본 파일명이 기본으로 입력되어 있도록 설정 response.setHeader("Content-Disposition", "attachment; filename=\"" + originalFileName +"\""); response.setHeader("Content-Length", "" + file.length()); //출력스트림 초기화 - 다른 JSP를 열면 출력 스트림 중복 생성 방지하기 위해 초기화함 out.clear(); //내장 객체인 response로부터 새로운 출력스트림 생성 OutputStream outStream = response.getOutputStream(); byte[] b = new byte[(int)file.length()]; int readBuffer = 0; while((readBuffer = inStream.read(b)) > 0) { outStream.write(b, 0, readBuffer); } //스트림 반납 inStream.close(); outStream.close(); } catch(Exception e) { //System.out.println("다운로드 중 예외 발생"); JSFunction.alertBack("다운로드 중 예외 발생", out); e.printStackTrace(); } %>
package kr.co.ezenac.utils; import javax.servlet.jsp.JspWriter; public class JSFunction { //메세지 알림창을 띄운 후 명시한 URL로 이동함 /* * msg : 알림창에 띄울 메세지 * url : 알림창을 닫은 후 이동할 페이지의 URL * out : 자바스크립트 코드를 삽입할 출력 스트림 */ public static void alertLocation(String msg, String url, JspWriter out) { try { String script = "" + "<script>" + "alert('" + msg + "');" + "location.href='" + url + "';" + "</script>"; out.println(script); } catch (Exception e) { } } //메세지 알림창을 띄운 후 이전 페이지로 돌아감 public static void alertBack(String msg, JspWriter out) { try { String script = "" + "<script>" + "alert('" + msg + "');" + "history.back();" + "</script>"; out.println(script); } catch (Exception e) { } } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>userAgent 확인</title> </head> <body> <% String client = request.getHeader("User-Agent"); out.println(client); %> </body> </html>
'개발자 수업 > JSP' 카테고리의 다른 글
25. Model2 방식 (0) 2021.12.21 24. jQuery Ajax (0) 2021.12.20 22. JSTL (0) 2021.12.15 21. 표현 언어(EL) (0) 2021.12.15 20. 게시판 만들기(모델1) 업로드 예정 (0) 2021.12.15