[ 파일 업로드 ]
○ 웹 브라우저에서 서버와 파일을 전송해 서버에 저장하는 것
○ 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 유형 서버로 업로드 가능
○ 웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼 태그 사용
○ 전송된 파일을 서버에 저장하기 위해 오픈 라이브러리 이용
○ 파일 업로드 위한 JSP 페이지
<form action="JSP 파일" method="POST" enctype="mjultipart/form-data">
<input type="file" name="요청 파라미터 이름">
</form>
- method : 반드시 POST 방식으로 설정
- enctype : 반드시 multipart/form-data로 설정
- action : 파일 업로드를 처리할 JSP 파일로 설정
- input type : 파일 업로드 위해 file로 설정
○ 단순한 자바 코드로 작성해 처리할 수 없기 때문에 오픈 라이브러리인 cos.jar 혹은 commonsfileupload.jar 사용
종류 | 특징 | 필요한 라이브러리 |
MultipartRequest 이용하기 | 가장 간단한 방법 | cos.jar |
아파치 API 이용하기 | 편리하고 강력한 API 제공 | commons-fileipload.jar commons-io.jar |
○ MultipartRequest
- 웹 페이지에서 서버로 업로드 되는 파일 자체만 다루는 클래스
- 웹 브라우저가 전송한 multipart/form-data 유형과 PSOT 방식의 요청 파라미터 등 분석 후 일반 데이터와 파일 데이터 구분해 파일 데이터에 접근
- 한글 인코딩 값을 얻기 쉽고 서버의 파일 저장 폴더에 동일한 파일명이 있으면 파일명을 자동으로 변경
- 배포 사이트 : http://www.servlets.com/cos/
매개변수 | 설명 |
request | Request 내장 객체 설정 |
saveDirectory | 서버의 파일 저장 경로 설정 |
maxPostSize | 파일의 최대 크기(바이트 단위)를 설정, 최대 크기를 초과하면 IOEXception 발생 |
encoding | 인코딩 유형 설정 |
policy | 파일명 변경 정책 설정, saveDirectory에 파일명이 중복되는 경우 덮어쓰기 여부를 설정하며, 설정하지 않으면 덮어씀 |
MultipartRequest(javax.servlet.http.HttpServletRequest request,
java.lang.String saveDirectory,
int maxPostSize,
java.lang.String encoding,
FileRenamePolicy policy)
메소드 | 유형 | 설명 |
getContentType(String name) | String | 업로드된 파일의 콘텐츠 유형을 반환, 업로드된 파일이 없으면 null 반환 |
getParameter(String name) | String | 요청 파라미터 이름이 name인 값 전달받음 |
getParameterNames() | java.util.Enumearation | 요청 파라미터 이름을 Enumeration 객체 타입으로 반환 |
getFile(String name) | java.io.File | 서버에 업로드된 파일에 대한 파일 객체 반환, 업로드된 파일이 없으면 null 반환 |
getFileNames() | java.util.Enumeration | 폼 페이지에 input 태그 내 type 속성값이 file로 설정된 요청 파라미터의 이름 반환 |
getFilesystemName(String name) | String | 사용자가 설정하여 서버에 실제로 업로드된 파일명을 반환, 파일명이 중복되면 변경된 파일명 반환 |
getOriginFileName(String name) | String | 사용자가 업로드한 실제 파일명을 반환, 파일명이 중복되면 변경 전의 파일명 반환 |
○ Commons-FileUpload
- 파일 업로드 패키지
- 서버의 메모리상에서 파일 처리가 가능하도록 지원
- 오픈 라이브러리 commons-fileupload.jar, commons-io.jar 파일을 배포 사이트에서 직접 다운로드해 사용
1) 배포 사이트 : http://commons.apache.org/downloads/
2) 다운로드 파일 : commons-fileupload-1.3.3-bin.zip, commons-io-2.6-bin.zip
3) imprt org.apache.commons.fileupload.*
- DiskfileUpload 클래스 메소드
메소드 | 유형 | 설명 |
setRepositoryPath (String repositoryPath) | void | 업로드된 파일을 임시로 저장할 디렉터리 설정 |
setSizeMax(long sizeMax) | void | 최대 파일 크기 설정 |
setSizeThreshold(int sizeThreshold) | void | 메모리상에 저장할 최대 크기 설정 |
parseRequest(HttpServletRequest req) | List<Fileitem> | multipart/form-data 유형의 요청 파라미터 가져옴 |
- FileItem 클래스 메소드
메소드 | 유형 | 설명 |
isFormField(0 | boolean | 요청 파라미터가 파일이 아니라 일반 데이터인 경우 true 반환 |
getFieldName() | String | 요청 파라미터의 이름을 얻어옴 |
getString | String | 기본 문자 인코딩을 사용해 요청 파라미터의 값을 얻어옴 |
getString(String encoding) | String | 설정한 문자 인코딩을 사용해 요청 파라미터의 값을 얻어옴 |
getName() | String | 업로드된 파일(경로 포함)의 이름을 얻어옴 |
getSize | long | 업로드된 파일의 크기르 얻어옴 |
get() | byte[] | 업로드된 파일을 바이트 배열로 얻어옴 |
isInMemory() | boolean | 업로드된 파일이 메모리에 저장된 상태인 경우 true를 반환, 임시 디렉터리에 저장된 경우 false 반환 |
delete() | void | 파일과 관련되 자원을 삭제, 메모리상에 저장된 경우 할당도니 메모리를 반환, 임시 파일로 저장된 경우 파일을 삭제 |
write() | void | 파일과 관련된 자원을 저장 |
getContentType() | String | 웹 브라우저가 전송하는 콘텐츠 유형을 반환, 정의되어 있지 않은 경우 null 반환 |
[ Product.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="dto.Product"%>
<%@ page import="dao.ProductRepository"%>
<jsp:useBean id="productDAO" class="dao.ProductRepository"
scope="session" />
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>상품 상세 정보</title>
<style>
.content .row {
padding: 30px 0;
display : flex;
}
.content .row div {
padding : 10px;
}
.content h3, .content p, .content h4 {
margin: 25px 0;
}
.content h3 {
margin-bottom: 5px;
}
.content .description {
margin-top: 5px;
}
.content .badge {
background-color: #f00;
color: #fff;
border-radius: 5px;
}
</style>
</head>
<body>
<jsp:include page="header.jsp" />
<div class="main">
<div class="banner">
<div class="container">
<h1>상품 정보</h1>
</div>
</div>
<%
String id = request.getParameter("id");
ProductRepository dao = ProductRepository.getInstance();
Product product = dao.getProductById(id);
%>
<div class="content">
<div class="container">
<div class="row">
<div>
<img alt="상품 사진" style="width:100%"
src="c:/upload/<%=product.getFilename()%>">
</div>
<div>
<h3><%=product.getPname()%></h3>
<p class="description"><%=product.getDescription()%></p>
<p>
<b>상품 코드 : </b><span class="badge"><%=product.getProductId()%></span>
<p>
<b>제조사</b> :
<%=product.getManufacturer()%></p>
<p>
<b>분류</b> :
<%=product.getCategory()%></p>
<p>
<b>재고 수</b> :
<%=product.getUnitInStock()%>
</p>
<h4><%=product.getUnitPrice()%>원
</h4>
<p>
<a href="#" class="btn btn-secondary">상품 주문 »</a> <a
href="./products.jsp" class="btn">상품 목록 »</a>
</p>
</div>
</div>
<hr>
</div>
</div>
</div>
<jsp:include page="footer.jsp" />
</body>
</html>
[ Products.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="dto.Product"%>
<%@ page import="dao.ProductRepository"%>
<jsp:useBean id="productDAO" class="dao.ProductRepository"
scope="session" />
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>상품 상세 정보</title>
<style>
.content .row {
padding: 30px 0;
display : flex;
}
.content .row div {
padding : 10px;
}
.content h3, .content p, .content h4 {
margin: 25px 0;
}
.content h3 {
margin-bottom: 5px;
}
.content .description {
margin-top: 5px;
}
.content .badge {
background-color: #f00;
color: #fff;
border-radius: 5px;
}
</style>
</head>
<body>
<jsp:include page="header.jsp" />
<div class="main">
<div class="banner">
<div class="container">
<h1>상품 정보</h1>
</div>
</div>
<%
String id = request.getParameter("id");
ProductRepository dao = ProductRepository.getInstance();
Product product = dao.getProductById(id);
%>
<div class="content">
<div class="container">
<div class="row">
<div>
<img alt="상품 사진" style="width:100%"
src="c:/upload/<%=product.getFilename()%>">
</div>
<div>
<h3><%=product.getPname()%></h3>
<p class="description"><%=product.getDescription()%></p>
<p>
<b>상품 코드 : </b><span class="badge"><%=product.getProductId()%></span>
<p>
<b>제조사</b> :
<%=product.getManufacturer()%></p>
<p>
<b>분류</b> :
<%=product.getCategory()%></p>
<p>
<b>재고 수</b> :
<%=product.getUnitInStock()%>
</p>
<h4><%=product.getUnitPrice()%>원
</h4>
<p>
<a href="#" class="btn btn-secondary">상품 주문 »</a> <a
href="./products.jsp" class="btn">상품 목록 »</a>
</p>
</div>
</div>
<hr>
</div>
</div>
</div>
<jsp:include page="footer.jsp" />
</body>
</html>
[ addProduct.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>상품 등록</title>
<style>
.inputRow {
margin: 15px 0px;
display: flex;
align-items : center;
}
.inputRow label {
width : 150px;
}
.inputRow input, .inputRow textarea {
font-size: 1.3rem;
}
.inputRow input.btn {
font-size: 1rem;
padding : 5px 15px;
}
</style>
</head>
<body>
<jsp:include page="header.jsp" />
<div class="main">
<div class="banner">
<div class="container">
<h1>상품 등록</h1>
</div>
</div>
<div class="content">
<div class="container">
<form name="newProduct" action="./processAddProduct.jsp"
class="form-horizontal" method="post" enctype="multipart/form-data">
<div class="inputRow">
<label for="productId">상품 코드</label> <input type="text"
name="productId" id="productId">
</div>
<div class="inputRow">
<label for="name">상품 명</label> <input type="text" name="name" id ="name">
</div>
<div class="inputRow">
<label for="unitPrice">가격</label> <input type="text" name="unitPrice" id="unitPrice">
</div>
<div class="inputRow">
<label for="description">상세 정보</label>
<textarea name="description" cols="50" rows="2" id="description">
</textarea>
</div>
<div class="inputRow">
<label for="manufacturer">제조사</label> <input type="text" name="manufacturer" id="manufacturer">
</div>
<div class="inputRow">
<label for="category">분류</label> <input type="text" name="category" id="category">
</div>
<div class="inputRow">
<label for="unitStock">재고 수</label> <input type="text" name="unitInStock" id="unitStock">
</div>
<div class="inputRow">
<label>상태</label>
<label><input type="radio" name="condition" value="New"> 신규 제품</label>
<label><input type="radio" name="condition" value="Old"> 중고 제품</label>
<label><input type="radio" name="condition" value="Refurbished"> 재생 제품</label>
</div>
<div class="inputRow">
<label for="productImage">이미지</label>
<input type="file" name="productImage" id="productImage">
</div>
<div class="inputRow">
<input type="submit" value="등록" class="btn btn-secondary">
</div>
</form>
<hr>
</div>
</div>
</div>
<jsp:include page="footer.jsp" />
</body>
</html>
[ ProcessAddProduct.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>상품 등록</title>
<style>
.inputRow {
margin: 15px 0px;
display: flex;
align-items : center;
}
.inputRow label {
width : 150px;
}
.inputRow input, .inputRow textarea {
font-size: 1.3rem;
}
.inputRow input.btn {
font-size: 1rem;
padding : 5px 15px;
}
</style>
</head>
<body>
<jsp:include page="header.jsp" />
<div class="main">
<div class="banner">
<div class="container">
<h1>상품 등록</h1>
</div>
</div>
<div class="content">
<div class="container">
<form name="newProduct" action="./processAddProduct.jsp"
class="form-horizontal" method="post" enctype="multipart/form-data">
<div class="inputRow">
<label for="productId">상품 코드</label> <input type="text"
name="productId" id="productId">
</div>
<div class="inputRow">
<label for="name">상품 명</label> <input type="text" name="name" id ="name">
</div>
<div class="inputRow">
<label for="unitPrice">가격</label> <input type="text" name="unitPrice" id="unitPrice">
</div>
<div class="inputRow">
<label for="description">상세 정보</label>
<textarea name="description" cols="50" rows="2" id="description">
</textarea>
</div>
<div class="inputRow">
<label for="manufacturer">제조사</label> <input type="text" name="manufacturer" id="manufacturer">
</div>
<div class="inputRow">
<label for="category">분류</label> <input type="text" name="category" id="category">
</div>
<div class="inputRow">
<label for="unitStock">재고 수</label> <input type="text" name="unitInStock" id="unitStock">
</div>
<div class="inputRow">
<label>상태</label>
<label><input type="radio" name="condition" value="New"> 신규 제품</label>
<label><input type="radio" name="condition" value="Old"> 중고 제품</label>
<label><input type="radio" name="condition" value="Refurbished"> 재생 제품</label>
</div>
<div class="inputRow">
<label for="productImage">이미지</label>
<input type="file" name="productImage" id="productImage">
</div>
<div class="inputRow">
<input type="submit" value="등록" class="btn btn-secondary">
</div>
</form>
<hr>
</div>
</div>
</div>
<jsp:include page="footer.jsp" />
</body>
</html>
[ ProductRepository.jsp ]
package dao;
import java.util.ArrayList;
import dto.Product;
public class ProductRepository {
private ArrayList<Product> listOfProducts = new ArrayList<Product>();
private static ProductRepository instance = new ProductRepository();
public static ProductRepository getInstance() {
return instance;
}
public ProductRepository() {
Product phone = new Product("P1234", "iPhone 6s", 800000);
phone.setDescription("4.7-inch, 1334X750 Renina HD display, 8-megapixel iSight Camera");
phone.setCategory("Smart Phone");
phone.setManufacturer("Apple");
phone.setUnitInStock(1000);
phone.setCondition("New");
phone.setFilename("p1234.png");
Product notebook = new Product("P1235", "LG PC 그램", 1500000);
notebook.setDescription("13.3-inch, IPS LED display, 5rd Generation notebook. Inter Core processors");
notebook.setCategory("Notebook");
notebook.setManufacturer("LG");
notebook.setUnitInStock(1000);
notebook.setCondition("Refurbished");
notebook.setFilename("p1235.png");
Product tablet = new Product("P1236", "Galaxy Tab S", 900000);
tablet.setDescription("212.8*125.6*6.6mm, Super AMOLEED display, Octa-Core processor");
tablet.setCategory("Tablet");
tablet.setManufacturer("Samsum");
tablet.setUnitInStock(1000);
tablet.setCondition("Old");
tablet.setFilename("p1236.png");
listOfProducts.add(phone);
listOfProducts.add(notebook);
listOfProducts.add(tablet);
}
public ArrayList<Product> getAllProducts() {
return listOfProducts;
}
public Product getProductById(String productId) {
Product productById = null;
for (int i = 0; i < listOfProducts.size(); i++) {
Product product = listOfProducts.get(i);
if(product != null && product.getProductId() != null && product.getProductId().equals(productId)){
productById = product;
break;
}
}
return productById;
}
public void addProduct(Product product) {
listOfProducts.add(product);
}
}
[ Product.java ]
package dto;
import java.io.Serializable;
public class Product implements Serializable{
private static final long serialVersionUID = 1L;
private String productId; // 상품아이디
private String pname; // 상품명
private Integer unitPrice; // 상품가격
private String description; // 상품설명
private String manufacturer; // 제조사
private String category; // 분류
private long unitInStock; // 재고수
private String condition; // 신상품 or 중고품 or 재생품
private String filename; // 이미지 파일명
public Product() {
super();
}
public Product(String productId, String pname, Integer unitPrice){
this.productId = productId;
this.pname = pname;
this.unitPrice = unitPrice;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Integer getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(Integer unitPrice) {
this.unitPrice = unitPrice;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public long getUnitInStock() {
return unitInStock;
}
public void setUnitInStock(long unitInStock) {
this.unitInStock = unitInStock;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public static long getSerialcersionuid() {
return serialVersionUID;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
'프로그래밍 언어 > JSP' 카테고리의 다른 글
JSP_22-11-02 (0) | 2022.11.02 |
---|---|
JSP_22-11-01 (0) | 2022.11.01 |
JSP_22-10-28(2) (0) | 2022.10.28 |
JSP_22-10-28(1) (0) | 2022.10.28 |