๐ปํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋
๋ธ๋ผ์ฐ์ ์ ์น์๋ฒ๊ฐ์ ํ์ผ ๋ณต์ฌํ๋ ๊ณผ์ ์ด๋ค.
์ ๋ก๋๋ ํด๋ผ์ด์ธํธ์ ์์์ด ์๋ฒ ์ธก์ผ๋ก ๋ณต์ฌ๋๋ ๊ณผ์ ์ด๊ณ , ๋ค์ด๋ก๋๋ ์๋ฒ์ ์์์ด ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก ๋ณต์ฌ๋๋ ๊ณผ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋ ํ ๋ ์ ์ถ๋ ฅ์คํธ๋ฆผ์ด ํ์ํ๋ฐ ๊ทธ ์ ์ถ๋ ฅ์คํธ๋ฆผ ๊ธฐ๋ฅ์ ๊ฐํธํ๊ฒ ์ ๊ณตํด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ cos library๊ฐ ์๋ค.
๐ปcos library ์ค์น
ํ์ผ ์ ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
COS File Upload Libaray
์ฌ์ดํธ ์ข์ธก COS File Upload Libaray๋ฅผ ์ ํํ๋ค.
๋ค์ด๋ก๋
ํ์ด์ง ํ๋จ Download์ Version์ ์๋ ์์ถํ์ผ์ ํด๋ฆญํ์ฌ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.
์์ถ ํด์
์์ถ ํด์ ํ jar ํ์ผ์ ํ๋ก์ ํธ์ ์ฐ๊ฒฐ์ ํด์ผํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๊ฒฐ
๋ฐฉ๋ฒ1. Bulid Path
๋ค์ด๋ก๋ ๋ฐ์ ํ์ผ์ ์์ถ์ ํ๊ณ ์์ถ ํด์ ๋ ํด๋ ์ lib > cos.jar๋ฅผ ํ๋ก์ ํธ์ Bulid Path๋ฅผ ํ๋ค.
โ ๋ฐฉ๋ฒ2. webapp > WEB-INF > lib > cos.jar ๋ณต์ฌ
๋ค์ด๋๋ฏน ์น ํ๋ก์ ํธ๋ง ๊ฐ๋ฅํ ์์ฃผ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๋ค.
WEB-INFํด๋ ์๋ libํด๋๋ฅผ ์์ฑํ์ฌ ๋ณต์ฌ·๋ถ์ฌ๋ฃ๊ธฐ๋ก ์ ์ฅํ๋ค.
์ด๋ก์จ ์๋ฒ ํ๋ก์ ํธ์ cos library ์ฐ๊ฒฐ์ด ์๋ฃ๋์๋ค.
์ ๋ก๋ ํ์ผ ์ ์ฉ ํด๋ ์์ฑ
๋ํ, webapp ํด๋ ์๋ files ํด๋๋ฅผ ์์ฑํ์ฌ ์ ๋ก๋ํ ํ์ผ์ ์ ์ฅํ ์ ์ฉ ํด๋๋ฅผ ๋ง๋ค์ด ์ค๋ค.
ํ์์ ์ด์ง ์์ง๋ง ์ ์ฉ ํด๋๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ํ์ผ ๊ด๋ฆฌ๊ฐ ์ง์ ๋ถํด์ง๋ค.
๐ปํ์ผ ์ ๋ก๋ ์ค์
- ex16.jsp : ํ์ผ ์ ์ก ํด๋์ค
- ex16_ok.jsp : ํ์ผ ์์ ํด๋์ค
ex16.jsp
<form method="POST" action="ex16_file_ok.jsp" enctype="multipart/form-data">
<input type="file" name="attach">
</form>
1. <input type="file">
- ์ผ๋ฐ์ ์ผ๋ก ํ์ผ ์ฒจ๋ถ์๋ file type์ input ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
2. <form method="POST>
- GET ๋ฐฉ์์ ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๊ธธ๋ฉด ์๋ฆด ์ ์๊ธฐ๋๋ฌธ์ POST ๋ฐฉ์์ผ๋ก ์ค์ ํ๋ค.
3. <form enctype="multipart/form-data">
- a. application/x-www-form-urlencoded (๊ธฐ๋ณธ๊ฐ) : ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฒ ๋ค.
- b. multipart/form-data : ๋ฌธ์์ด๊ณผ ๋น๋ฌธ์์ด์ ๋์์ ์ ์กํ๊ฒ ๋ค.
<form enctype="multipart/form=data">์ ์ ์ฉํ์ฌ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ฉด
request.getParameter() , request.getParameterValues() ๋์ ํ์ง ์๋๋ค.
ex16_ok.jsp
<%
String name = request.getParameter("name");
String age = request.getParameter("age");
%>
request.getParameter ๊ฐ ๋์ํ์ง ์์ name, age๋ฅผ ์ถ๋ ฅํ๋ฉด null๊ฐ์ด ์ถ๋ ฅ๋๋ค.
๋ฐ๋ผ์, cos.jar ํ์ผ์ด MultipartRequest ํด๋์ค์ ๊ฐ์ฒด๊ฐ request์ ์์ ๊ธฐ๋ฅ์ ๋์ ํ๋ค.
๋ก์ปฌ๊ฒฝ๋ก
์ด์ ์ webapp ํด๋ ์๋ files ํด๋๋ฅผ ์์ฑํ์ฌ ์ ์ฉ ํด๋๋ฅผ ๋ง๋ค์ด ์ฃผ์๋๋ฐ ์ด์ ๋ํ ๋ก์ปฌ ๊ฒฝ๋ก๊ฐ ํ์ํ๋ค.
<%
String path = application.getRealPath("/files");
%>
์ ์ฝ๋๋ ์น์์ ์ฐ๋ ์๋๊ฒฝ๋ก๋ ์ ๋๊ฒฝ๋ก๋ฅผ ๋ก์ปฌ ๊ฒฝ๋ก๋ก ๋ณํํด์ค๋ค.
'C:\class\code\server\JSPTest\src\main\webapp\files' ์ ๊ฒฝ๋ก๋ฅผ
'C:\class\code\server\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\JSPTest\files' ๋ก ๋ฐ๊ฟ์ค๋ค.
(๋ณธ์ธ์ ํ๋ก์ ํธ ๊ฒฝ๋ก์ ๋ฐ๋ผ ํด๋น ์์น๋ ๋ฌ๋ผ์ง ์ ์์)
getRealPath() ๋ฉ์๋๋ ์๋ธ๋ฆฟ ์ปจํ
์คํธ์ ์ค์ ํ์ผ ์์คํ
๊ฒฝ๋ก๋ฅผ ์ป์ด์จ๋ค.
/files๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ธ๋ค. '/'๋ webapp ํด๋๋ฅผ ์๋ฏธํ๋ฉฐ ๊ทธ ์๋์ ์๋ files ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
ํ๋ก์ ํธ ๋ด wtpwebapps ํด๋ ์์ ์ค์ ๋ก ์คํ๋๋ ํด๋๋ฅผ ๋ง๋ค์ด๋์๋ค. ์ด ํด๋๋ฅผ ์คํ ํด๋๋ผ๊ณ ํ๋ฉฐ, ์ค์ ์ด์ ์ค์ธ ์์ ์์น์ด๋ฏ๋ก, ํ์ผ์ ์ ๋ก๋ํ๋ฉด ์ด๊ณณ์ files ํด๋์ ๋ณต์ฌ๋ณธ์ผ๋ก ์ ์ฅ๋๋ค.
ํ์ผ ์ต๋ ์ฌ์ด์ฆ ์ง์
<%
int size = 1024*1024*100; //100MB
%>
size ๋ณ์์ ์ ๋ก๋ํ ํ์ผ์ ์ต๋ ์ฌ์ด์ฆ๋ฅผ ์ง์ ํด์ค๋ค.
๋ฐ์ดํธ ๋จ์๋ก์จ
MultipartRequest
- cos library ์๋ MultipartRequest๋ผ๋ ํด๋์ค๊ฐ ์๋ค. cos library์์ ๊ฐ์ฅ ์ค์ฌ์ ์ธ ์ญํ ์ ํ๋ ํด๋์ค์ด๋ค.
- ์ฃผ์ ํน์ง์ ํ์ผ์ ๋ก๋๋ฅผ ๋น๋กฏํด ํ์ผ ์ค๋ณต ์ฒ๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- ๋ํ, ์ ๋ก๋๋ ํ์ผ์ ๊ด๋ฆฌํ๊ณ ์๋ฒ์ ํน์ ์์น์ ์ ์ฅํ๋ค.
ex16_ok.jsp
<%
String name="";
String age="";
String filename="";
String orgfilename="";
try {
//1. ํ์ผ ์
๋ก๋ ์ฒ๋ฆฌ
MultipartRequest multi = new MultipartRequest(
request,
path,
size,
"UTF-8",
new DefaultFileRenamePolicy()
);
//2. ๋ฐ์ดํฐ ์์
name = multi.getParameter("name");
age = multi.getParameter("age");
//3. ํ์ผ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
filename = multi.getFilesystemName("attach");
orgfilename = multi.getOriginalFileName("attach");
} catch(Exception e) {
e.printStackTrace();
}
%>
์ธ๋ถ ํ์ผ ์ ์ถ๋ ฅ์ ํ๊ธฐ์ try-catch ๋ฌธ์ผ๋ก ์๋ฌ๋ฅผ ์ ์ดํ๋ค.
1. ํ์ผ ์ ๋ก๋ ์ฒ๋ฆฌ
- MultipartRequest ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์๊ฐ ์ด๋ฏธ ์ฒจ๋ถํ์ผ์ files์ ๋ณต์ฌ๊ฐ ์๋ฃ๋๋ค.
- request : ์๋ request
- path : ํ์ผ ์ ๋ก๋ ์์น
- size : ์์์ ์ง์ ํ ์ต๋ ํ์ผ ํฌ๊ธฐ
- "UTF-8" : ํ์ผ ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ
- new DefaultFileRenamePolicy() : ํ์ผ๋ช ์ด ์ค๋ณต๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ํ์ผ๋ช ์ ๋ณ๊ฒฝํ๋ ๋๋ฒ๋ง ์์
2. ๋ฐ์ดํฐ ์์
- ex16.jsp ๋ฐ์ดํฐ ์์ฑ ๋ฐ ์ก์ ํ ํผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
3. ํ์ผ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
- getFilesystemName : ํ์ผ์ด ์ ์ฅ๋ ์ค์ ์ด๋ฆ
- getOriginalFileName : ์ฌ์ฉ์๊ฐ ์ฌ๋ ธ๋ ์๋ณธ ์ด๋ฆ
- ์ ๋ํ ํ์ผ๋ช ์ด files ํด๋ ๋ด์์ ์ค๋ณต ๋ ๊ฒฝ์ฐ, DefaultFileRenamePolicy ์ผ๋ก ๋๋ฒ๋ง ๋์ด ์ ์ฅ๋๋ฏ๋ก ๋ด๊ฐ ์ฌ๋ฆฐ ์ค์ ํ์ผ๋ช ๊ณผ ์ ์ฅ๋๋ ํ์ผ๋ช ์ ๋ค๋ฅผ ์ ์๋ค.
ํ์ผ ์ ์ฅ ๋ฐฉ๋ฒ
๋ฑ๋กํ๊ธฐ๋ฅผ ๋๋ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ๋ฐ์ ํผ์์ ํ์ผ์ ์ด๋ป๊ฒ ์ ์ฅํ ์ง ์ธ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. ๋ทฐ์ด
์๋ ์ฝ๋์ ์ฅ์ ์ ์ฝ๋ ์์ฑ์ด ๊ฐ๋จํ๋ค๋ ๊ฒ์ด๊ณ ๋จ์ ์ ํ์ผ ํ์ฅ์ ๋ง๋ค ๋ค์ด๋ก๋๋๊ฑฐ๋ ๋ทฐ์ด๋ก ๋ฐ ์๋ ์๋ค.
ex16_ok.jsp
<a href="/jsp/files/<%= filename %>"><%= orgfilename %></a>
2. download
download๋ ๋ชจ๋ ํ์ผ์ ๋ฌด์กฐ๊ฑด ๋ค์ด๋ก๋ ์ํค๋ ์ต์
์ด๋ค.
์๋ ์ฝ๋์ ์ฅ์ ์ ์ฝ๋ ์์ฑ์ด ๊ฐ๋จํ๋ค๋ ๊ฒ์ด๊ณ , ๋จ์ ์ ๋๋ฒ๋ง๋ ํ์ผ์ ํ์ผ๋ช
์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ด๋ค.
์ด์ ์ susukkang.png ํ์ผ์ ๋ฑ๋กํด์ ํ์ผ๋ช ๋ค์ ๋๋ฒ๋ง๋์ด susukkang1.png๊ฐ ๋์๋ค.
download ์ต์ ์ ๋๋ฒ๋ง๋ ํ์ผ๋ช ๊ทธ๋๋ก ์ ์ฅํ๋ค.
ex16_ok.jsp
<a href="/jsp/files/<%= filename %>" download><%= orgfilename %></a>
3. download.jsp ๋ชจ๋ ํ์ฉ(์ฐธ์กฐ)
๋ฏธ๋ฆฌ ์์ฑ๋ jsp ํ์ผ์ ํ์ฉํ๋ค.
์๋ณธ ํ์ผ๋ช ์ผ๋ก ๋ค์ด๋๋๊ฐ ๋๋, ๊ฐ ์ต์ ์ ๋ง๊ฒ ์์ฑํ๋ ค๋ฉด ์ฝ๋ ์์ฑํ๋ ๋น์ฉ์ด ๋๋ ๋จ์ ์ด ์๋ค.
ex16_ok.jsp
<a href="download.jsp?filename=<%= filename %>&orgfilename=<%= orgfilename %>"><%= orgfilename %></a>
๐ป์ ์ฒด ์ฝ๋
ex16.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex16_file</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>ํ์ผ ์
๋ก๋</h1>
<form method="POST" action="ex16_file_ok.jsp" enctype="multipart/form-data">
<table class="vertical">
<tr>
<th>์ด๋ฆ</th>
<td><input type="text" name="name"></td>
</tr>
<tr>
<th>๋์ด</th>
<td><input type="number" name="age" min="1" max="100"></td>
</tr>
<tr>
<th>ํ์ผ</th>
<td><input type="file" name="attach"></td>
</tr>
</table>
<div>
<input type="submit" value="๋ฑ๋กํ๊ธฐ">
</div>
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
ex16_ok.jsp
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String path = application.getRealPath("/files");
int size = 1024*1024*100; //100MB
String name=""; //์ด๋ฆ
String age=""; //๋์ด
String filename=""; //์ฒจ๋ถํ์ผ๋ช
String orgfilename=""; //์ฒจ๋ถํ์ผ๋ช
try {
MultipartRequest multi = new MultipartRequest(
request, //์๋ request
path, //ํ์ผ ์
๋ก๋ ์์น
size, //์ต๋ ํ์ผ ํฌ๊ธฐ
"UTF-8", //ํ์ผ ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ
new DefaultFileRenamePolicy()
);
name = multi.getParameter("name");
age = multi.getParameter("age");
filename = multi.getFilesystemName("attach"); //ํ์ผ๋ช
(์ ์ฅ๋ ํ์ผ๋ช
)
orgfilename = multi.getOriginalFileName("attach"); //ํ์ผ๋ช
(์๋ณธ ํ์ผ๋ช
)
} catch(Exception e) {
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex16_file_ok</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>๊ฒฐ๊ณผ</h1>
<div>
์ด๋ฆ: <%= name %>
</div>
<div>
๋์ด: <%= age %>
</div>
<div>
ํ์ผ๋ช
: <%= filename %>
</div>
<div>
ํ์ผ๋ช
: <%= orgfilename %>
</div>
<h2>ํ์ผ ๋ค์ด๋ก๋</h2>
<%-- <div>
<a href="/jsp/files/<%= filename %>"><%= orgfilename %></a>
</div> --%>
<%-- <div>
<a href="/jsp/files/<%= filename %>" download><%= orgfilename %></a>
</div> --%>
<div>
<a href="download.jsp?filename=<%= filename %>&orgfilename=<%= orgfilename %>"><%= orgfilename %></a>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
๐ป๋ค์ค ํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋
- ๋จ์ผ ํ์ผ ์ ๋ก๋ ๋ฐ ๋ค์ด๋ก๋ ๋ฐฉ๋ฒ๊ณผ 99% ๊ฐ๋ค. ๋จ, ํ์ผ ์ด๋ฆ์ ์ฌ๋ฌ๊ฐ ์ ์ฅ์ด ํ์ฉํ์ฌ ArrayList๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ๋ค๋ฅด๋ค.
- ex17.jsp : ํ์ผ ์ ๋ก๋ ํด๋์ค
- ex17_ok.jsp : ํ์ผ ๋ค์ด๋ก๋ ํด๋์ค
ex17.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex17</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>๋ค์ค ํ์ผ ์
๋ก๋</h1>
<form method="POST" action="ex17_ok.jsp" enctype="multipart/form-data">
<table class="vertical">
<tr>
<th>ํ์ผ1</th>
<td><input type="file" name="attach1"></td>
</tr>
<tr>
<th>ํ์ผ2</th>
<td><input type="file" name="attach2"></td>
</tr>
<tr>
<th>ํ์ผ3</th>
<td><input type="file" name="attach3"></td>
</tr>
</table>
<div>
<input type="submit" value="์
๋ก๋">
</div>
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
ex17_ok.jsp
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = application.getRealPath("/files");
int size = 1024*1024*100; //100MB
ArrayList<String> filename = new ArrayList<String>();
ArrayList<String> orgfilename = new ArrayList<String>();
try {
MultipartRequest multi = new MultipartRequest (
request,
path,
size,
"UTF-8",
new DefaultFileRenamePolicy()
);
//๋ค์ค ํ์ผ๋ช
์ ์ปฌ๋ ์
์ ํ ๋นํ๊ธฐ
filename.add(multi.getFilesystemName("attach1"));
filename.add(multi.getFilesystemName("attach2"));
filename.add(multi.getFilesystemName("attach2"));
orgfilename.add(multi.getOriginalFileName("attach1"));
orgfilename.add(multi.getOriginalFileName("attach2"));
orgfilename.add(multi.getOriginalFileName("attach3"));
} catch (Exception e) {
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex17_ok</title>
<link rel="stylesheet" href="http://pinnpublic.dothome.co.kr/cdn/example-min.css">
</head>
<body>
<h1>๋ค์ด๋ก๋</h1>
<% for(int i=0; i<3; i++) { %>
<div><a href="download.jsp?filename=<%= filename.get(i) %>&orgfilename=<%= orgfilename.get(i)%>"><%= orgfilename.get(i)%></a></div>
<%} %>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="http://pinnpublic.dothome.co.kr/cdn/example-min.js"></script>
</body>
</html>
ํ์ผ๋ช ์ ๋ค์ค์ผ๋ก ์ ์ฅํ๊ธฐ ์ํด ArrayList๋ฅผ ์ฌ์ฉํ๋ค.
add๋ฅผ ํตํด ํ์ผ๋ช ์ ์ถ๊ฐํ๊ณ
get๋ฅผ ํตํด ํ์ผ๋ช ์ ์ถ๋ ฅํ์๋ค.