본문 바로가기

안녕하세요!

프로그래밍 언어/JSP

JSP_22.10.31

[ 파일 업로드 ]

○ 웹 브라우저에서 서버와 파일을 전송해 서버에 저장하는 것

○ 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 유형 서버로 업로드 가능

○ 웹 브라우저에서 서버로 파일을 전송하기 위해 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/

 

Apache Commons – Apache Commons

Downloads Binary and source releases and links into the archives may be obtained by selecting a project below Release Announcements We recommend that you subscribe to the Apache Announce mailing list to be notified when releases are made by the Commons pro

commons.apache.org

      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">상품 주문 &raquo;</a> <a
								href="./products.jsp" class="btn">상품 목록 &raquo;</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">상품 주문 &raquo;</a> <a
								href="./products.jsp" class="btn">상품 목록 &raquo;</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;
	}
	
	
	
	
}
728x90
반응형

'프로그래밍 언어 > 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

loading