jsp는 FTP의 파일을 어떻게 다운로드합니까?
33564 단어 jsp
,
①---ftp
、 java :
package ftp;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
public class FtpFile {
String serverIp = "192.168.12.49";
String serverUser = "admin";
String serverPwd = "admin";
FtpClient aftp;
DataOutputStream outputs;
TelnetInputStream ins;
TelnetOutputStream outs;
int ch;
public String a;
String hostname = "";
private String path = "/";
public FtpClient connect(String RWFileDir, String hostname, int port,
String uid, String pwd) {
/*
* this.hostname = hostname;
* System.out.println(" "+hostname+", ....."); try{ aftp = new
* FtpClient(hostname,port); aftp.login(uid,pwd); aftp.binary();
* //aftp.openPortDataConnection(); a = " :"+hostname+" !";
* System.out.println(a); } catch(FtpLoginException e){
* a=" :"+hostname+" ! :"+e; System.out.println(a);
* //return false; } catch (IOException e){
* a=" :"+hostname+" ! :"+e; System.out.println(a); //return
* false; } catch(SecurityException e) {
* a=" :"+hostname+" ! :"+e; System.out.println(a);
* //return false; }
*/
// log(RWFileDir,a);
FtpClient ftpClient = null;
try {
ftpClient = new FtpClient();
// FtpClient
ftpClient.openServer(hostname);
// FTP
ftpClient.login(uid, pwd);
// FTP
aftp = ftpClient;
aftp.cd(RWFileDir);
} catch (IOException ex) {
;
}
return ftpClient;
}
public void stop(String RWFileDir) {
String message = "";
try {
if (aftp != null) {
aftp.closeServer();
message = " " + hostname + " !";
System.out.println(message);
//log(RWFileDir, message);
}
} catch (IOException e) {
message = " " + hostname + " !" + e;
System.out.println(message);
log(RWFileDir, message);
}
}
public void showFileContents(String strdir) {
StringBuffer buf = new StringBuffer();
try {
aftp.cd(strdir);
ins = aftp.list();
while ((ch = ins.read()) >= 0) {
buf.append((char) ch);
}
System.out.println("buf-------------" + buf.toString());
ins.close();
} catch (IOException e) {
}
}
//
public ArrayList getFileList() throws IOException {
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp
.list()));
ArrayList a1 = new ArrayList(); //
// ArrayList a2= new ArrayList(); //
ArrayList a3 = new ArrayList(); //
// ArrayList a4= new ArrayList(); //
ArrayList a5 = new ArrayList(); //
String s = "";
// Hashtable ha=new Hashtable();
// ha=null;
while ((s = dr.readLine()) != null) {
if (isFile(s)) {
// a4.clear();
// a4.remove(0);
// a4=null;
ArrayList a4 = new ArrayList(); //
a4.add(parseLine(s).get(8).toString());
a4.add(" ");
a4.add(parseLine(s).get(4).toString() + "bytes");
a3.add(a4);
}
else if (isDir(s)) {
// a2.add(parseLine(s).get(8));
// showFileContents(s);
// a3.add(parseLine(s));
// System.out.println("ssssssss:"+s);
// a4.add(getNameList(s));
// a2.clear();
// a2.remove(0);
// a2=null;
String tem = parseLine(s).get(8).toString();
if ((tem.trim().equals(".")) || (tem.trim().equals(".."))) {
} else {
ArrayList a2 = new ArrayList(); //
a2.add(parseLine(s).get(8).toString());
// a2.add("nbsp;");
a2.add(" ");
a2.add(parseLine(s).get(4).toString() + "bytes");
a1.add(a2);
}
}
// a1.add(parseLine(s).get(8));
// a1.add(s);
// System.out.println("xxxxxxxxxxxxxxxxx:"+parseLine(s).get(8));
// a1.addAll(a2);
}
a5.add(a1);
a5.add(a3);
dr.close();
aftp.closeServer();
return a5;
}
public void setPath(String path) throws IOException {
if (aftp == null)
this.path = path;
else {
aftp.cd(path);
}
}
//
public ArrayList getNameList(String RWFileDir) throws IOException {
// System.out.println("xxxxxxx--------------111111111");
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp
.nameList(RWFileDir)));
// System.out.println("xxxxxxx---------------22222222222");
// System.out.println(dr.readLine().toString()+"ddddddddd");
ArrayList al = new ArrayList();
String s = "";
int j = 0;
while ((s = dr.readLine()) != null) {
System.out.println(s);
al.add(s);
j++;
// s = s.substring(13,s.length());
isFile(s);
// downloadFile(RWFileDir,s);
// String strFileDelF = aftp.nameList("subunsubtosp//");
// File fileDelF=new File(s);
// fileDelF.delete();
}
System.out.println("xxxxxxxxxxxx" + j);
return al;
// System.out.println(al.add(s));
}
//
public boolean isDir(String line) {
return ((String) parseLine(line).get(0)).indexOf("d") != -1;
}
public boolean isFile(String line) {
return !isDir(line);
}
// getFileList
private ArrayList parseLine(String line) {
ArrayList s1 = new ArrayList();
StringTokenizer st = new StringTokenizer(line, " ");
while (st.hasMoreTokens()) {
s1.add(st.nextToken());
}
return s1;
}
//
public static void log(String RWFileDir, String msg) {
String message = "";
try {
java.text.DateFormat df = new java.text.SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
java.text.DateFormat dflog = new java.text.SimpleDateFormat(
"yyyyMMdd");
java.util.Date date = new java.util.Date();
String datestr = df.format(new java.util.Date());
String datelog = dflog.format(new java.util.Date());
// String datelog = datestr.substring(0,10);
// datelog = datelog.replace('-',' ');
//
FileWriter fwl = new FileWriter(RWFileDir + "CMSSftp" + datelog
+ ".log", true);
PrintWriter outl = new PrintWriter(fwl);
outl.println(datestr + " " + msg);
outl.close();
fwl.close();
} catch (IOException e) {
message = " log !" + e;
e.printStackTrace();
log(RWFileDir, message);
System.out.println(message);
}
}
}
、 main.jsp , ftp:// : :@IP/ / :
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ page import="ftp.*"%>
<%@ page import="java.util.ArrayList;"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>FTP </title>
<meta content="text/html; charset=gb2312" http-equiv="Content-Type">
<link rel="stylesheet" type="text/css" href="css/list.css">
</head>
<body>
<form id='list' name='list' action='post'>
<%
/*
*FTP : FTP
*FTP : FTP
*/
String server = "192.168.12.49"; // FTP IP
String user = "admin"; // FTP
String password = "admin"; // FTP
String path = request.getParameter("path");
if ((path == null) || (path.length() < 1)) {
path = "/";
} else {
path = new String(path.getBytes("ISO-8859-1"), "GBK"); //
}
ArrayList arr = new ArrayList(); // list list
ArrayList arr1 = new ArrayList(); // list
ArrayList arr2 = new ArrayList(); // list
ArrayList arr3 = new ArrayList(); // list,
FtpFile ft = null;
try {
ft = new FtpFile();
ft.connect(path, server, 21, user, password);
arr = ft.getFileList(); //
} catch (Exception ex) {
System.out.println(ex.toString());
}
arr1 = (ArrayList) arr.get(0);
arr2 = (ArrayList) arr.get(1);
out
.print("<font size='4'><center><b>FTP </b></center></font><br>");
out.print("<table style='width:80%' align='center'><tr>");
out.print("<td align='left'><font size='2' color='red'>* :"
+ path + "</font></td>");
out
.print("<td align='right'><input type='button' align='right' value=' ' onClick='history.go(-1)'></td>");
out
.println("<table border=0 cellPadding='5' cellSpacing='2' class='listtable' align='center' style='width:80%'><tr class='firstline'><td width='200px'align='center'> </td><td width='60px' align='center'> </td><td width='100' align='center'> </td><td align='center'> </td></tr>");
for (int i = 0; i < arr1.size(); i++) { //
arr3 = (ArrayList) arr1.get(i);
out.print("<tr class='line'>");
for (int j = 0; j < arr3.size(); j++) {
out.print("<td><B>");
String tempstr = arr3.get(j).toString();
if (j == 0) {
if (path.length() > 1) {
out.print("<a href='main.jsp?path=" + path + "/"
+ tempstr + "'>" + tempstr + "</a>");
} else {
out.print("<a href='main.jsp?path=" + path
+ tempstr + "'>" + tempstr + "</a>");
}
} else {
out.print(tempstr);
}
out.print("</B></td>");
}
out.print("<td> </td></tr>");
}
String filename = null;
for (int i = 0; i < arr2.size(); i++) { //
arr3 = (ArrayList) arr2.get(i);
out.print("<tr class='line'>");
for (int j = 0; j < arr3.size(); j++) {
out.print("<td>");
String tempstr = arr3.get(j).toString();
if (j == 0) {
filename = tempstr;
if (path.trim().length() > 1) { // path
out.print("<a href='ftp://" + user + ":" + password
+ "@" + server + path + "/" + filename
+ "'>" + tempstr + "</a>");
} else { //path
out.print("<a href='ftp://" + user + ":" + password
+ "@" + server + path + filename + "'>"
+ tempstr + "</a>");
}
} else {
out.print(tempstr);
}
out.print("</td>");
}
if (path.trim().length() > 1) { // path
out
.print("<td width='100px' align='center'><a href='ftp://"
+ user
+ ":"
+ password
+ "@"
+ server
+ path
+ "/"
+ filename
+ "'> </a></td></tr>");
} else { //path
out
.print("<td width='100px' align='center'><a href='ftp://"
+ user
+ ":"
+ password
+ "@"
+ server
+ path + filename + "'> </a></td></tr>");
}
}
out.print("</table>");
ft.stop(path);
ft = null;
%>
</form>
</body>
</html>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
② :
FTP , , , , TOMCAT , WEBLOGIC , , , RAR.JPG , ,GOOGLE N , , , 。
:
、 JAVA , , ,
package ftp;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
public class FtpFile {
String serverIp = "192.168.12.49";
String serverUser = "admin";
String serverPwd = "admin";
FtpClient aftp;
DataOutputStream outputs;
TelnetInputStream ins;
TelnetOutputStream outs;
int ch;
public String a;
String hostname = "";
private String path = "/";
public FtpClient connect(String RWFileDir, String hostname, int port,
String uid, String pwd) {
/*
* this.hostname = hostname;
* System.out.println(" "+hostname+", ....."); try{ aftp = new
* FtpClient(hostname,port); aftp.login(uid,pwd); aftp.binary();
* //aftp.openPortDataConnection(); a = " :"+hostname+" !";
* System.out.println(a); } catch(FtpLoginException e){
* a=" :"+hostname+" ! :"+e; System.out.println(a);
* //return false; } catch (IOException e){
* a=" :"+hostname+" ! :"+e; System.out.println(a); //return
* false; } catch(SecurityException e) {
* a=" :"+hostname+" ! :"+e; System.out.println(a);
* //return false; }
*/
// log(RWFileDir,a);
FtpClient ftpClient = null;
try {
ftpClient = new FtpClient();
// FtpClient
ftpClient.openServer(hostname);
// FTP
ftpClient.login(uid, pwd);
// FTP
aftp = ftpClient;
aftp.cd(RWFileDir);
} catch (IOException ex) {
;
}
return ftpClient;
}
public void stop(String RWFileDir) {
String message = "";
try {
if (aftp != null) {
aftp.closeServer();
message = " " + hostname + " !";
System.out.println(message);
//log(RWFileDir, message);
}
} catch (IOException e) {
message = " " + hostname + " !" + e;
System.out.println(message);
log(RWFileDir, message);
}
}
public void showFileContents(String strdir) {
StringBuffer buf = new StringBuffer();
try {
aftp.cd(strdir);
ins = aftp.list();
while ((ch = ins.read()) >= 0) {
buf.append((char) ch);
}
System.out.println("buf-------------" + buf.toString());
ins.close();
} catch (IOException e) {
}
}
//
public ArrayList getFileList() throws IOException {
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp
.list()));
ArrayList a1 = new ArrayList(); //
// ArrayList a2= new ArrayList(); //
ArrayList a3 = new ArrayList(); //
// ArrayList a4= new ArrayList(); //
ArrayList a5 = new ArrayList(); //
String s = "";
// Hashtable ha=new Hashtable();
// ha=null;
while ((s = dr.readLine()) != null) {
if (isFile(s)) {
// a4.clear();
// a4.remove(0);
// a4=null;
ArrayList a4 = new ArrayList(); //
a4.add(parseLine(s).get(8).toString());
a4.add(" ");
a4.add(parseLine(s).get(4).toString() + "bytes");
a3.add(a4);
}
else if (isDir(s)) {
// a2.add(parseLine(s).get(8));
// showFileContents(s);
// a3.add(parseLine(s));
// System.out.println("ssssssss:"+s);
// a4.add(getNameList(s));
// a2.clear();
// a2.remove(0);
// a2=null;
String tem = parseLine(s).get(8).toString();
if ((tem.trim().equals(".")) || (tem.trim().equals(".."))) {
} else {
ArrayList a2 = new ArrayList(); //
a2.add(parseLine(s).get(8).toString());
// a2.add("nbsp;");
a2.add(" ");
a2.add(parseLine(s).get(4).toString() + "bytes");
a1.add(a2);
}
}
// a1.add(parseLine(s).get(8));
// a1.add(s);
// System.out.println("xxxxxxxxxxxxxxxxx:"+parseLine(s).get(8));
// a1.addAll(a2);
}
a5.add(a1);
a5.add(a3);
dr.close();
aftp.closeServer();
return a5;
}
public void setPath(String path) throws IOException {
if (aftp == null)
this.path = path;
else {
aftp.cd(path);
}
}
//
public ArrayList getNameList(String RWFileDir) throws IOException {
// System.out.println("xxxxxxx--------------111111111");
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp
.nameList(RWFileDir)));
// System.out.println("xxxxxxx---------------22222222222");
// System.out.println(dr.readLine().toString()+"ddddddddd");
ArrayList al = new ArrayList();
String s = "";
int j = 0;
while ((s = dr.readLine()) != null) {
System.out.println(s);
al.add(s);
j++;
// s = s.substring(13,s.length());
isFile(s);
// downloadFile(RWFileDir,s);
// String strFileDelF = aftp.nameList("subunsubtosp//");
// File fileDelF=new File(s);
// fileDelF.delete();
}
System.out.println("xxxxxxxxxxxx" + j);
return al;
// System.out.println(al.add(s));
}
//
public boolean isDir(String line) {
return ((String) parseLine(line).get(0)).indexOf("d") != -1;
}
public boolean isFile(String line) {
return !isDir(line);
}
// getFileList
private ArrayList parseLine(String line) {
ArrayList s1 = new ArrayList();
StringTokenizer st = new StringTokenizer(line, " ");
while (st.hasMoreTokens()) {
s1.add(st.nextToken());
}
return s1;
}
//
public static void log(String RWFileDir, String msg) {
String message = "";
try {
java.text.DateFormat df = new java.text.SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
java.text.DateFormat dflog = new java.text.SimpleDateFormat(
"yyyyMMdd");
java.util.Date date = new java.util.Date();
String datestr = df.format(new java.util.Date());
String datelog = dflog.format(new java.util.Date());
// String datelog = datestr.substring(0,10);
// datelog = datelog.replace('-',' ');
//
FileWriter fwl = new FileWriter(RWFileDir + "CMSSftp" + datelog
+ ".log", true);
PrintWriter outl = new PrintWriter(fwl);
outl.println(datestr + " " + msg);
outl.close();
fwl.close();
} catch (IOException e) {
message = " log !" + e;
e.printStackTrace();
log(RWFileDir, message);
System.out.println(message);
}
}
}
、 jsp main.jsp:
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ page import="java.io.IOException.*"%>
<%@ page import="java.io.IOException,sun.net.TelnetInputStream,sun.net.ftp.FtpClient"%>
<%@ page import="ftp.*"%>
<%@ page import="java.util.ArrayList;"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"
prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html"
prefix="html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> </title>
<meta content="text/html; charset=gb2312" http-equiv="Content-Type">
<link rel="stylesheet" type="text/css" href="css/list.css">
</head>
<body>
<form id='list' name='list' action='post'>
<table border=0>
<tr>
<td>
<html:link forward="insert">
</html:link>
</td>
</tr>
<tr>
<td>
<html:link forward="login">
</html:link>
</td>
</tr>
<tr>
<td>
<html:link forward="search">
</html:link>
</td>
</tr>
<tr>
<td>
<html:link forward="display">
</html:link>
</td>
</tr>
<tr>
<td>
<html:link forward="logout">
</html:link>
</td>
</tr>
<tr>
</table>
<%
// String server=serverEdit.getText();
String server = "192.168.12.49";
// FTP IP
// String user=userEdit.getText();
String user = "admin";
// FTP
// String password=passwordEdit.getText();
String password = "admin";
// FTP
// String path=pathEdit.getText();
String temppath = null;
String path1 = null;
//session.removeAttribute("path");
//session.removeAttribute("filename");
String path = request.getParameter("path");
//String path=new String((request.getParameter("path")).getBytes("ISO-8859-1"), "GBK");
//String path=request.getAttribute("test").toString();
if ((path == null) || (path.length() < 1)) {
path = "/";
path1 = "/";
} else {
path = new String(path.getBytes("ISO-8859-1"), "GBK"); //
//path = "/" + temppath;
//path1="/"+temppath;
}
//out.println("<script language='javascript'>alert('"+path+"')</script>");
// FTP
System.out.println("eeee");
ArrayList arr = new ArrayList();
ArrayList arr1 = new ArrayList();
ArrayList arr2 = new ArrayList();
ArrayList arr3 = new ArrayList();
//Hashtable ha=new Hashtable();
FtpFile ft = null;
try {
ft = new FtpFile();
ft.connect(path, server, 21, user, password);
//arr = ft.getNameList(path);
//System.out.println("xxxxxxxxxxxxxxxxxxx");
arr = ft.getFileList();
} catch (Exception ex) {
System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeee");
}
arr1 = (ArrayList) arr.get(0);
arr2 = (ArrayList) arr.get(1);
//arr2=(ArrayList)ha.get("file");
//System.out.println(arr1.toString());
//out.println(arr1.size()+" ");
out.print(" :" + path);
//session.setAttribute("path",path);
out
.print("<p align='center'><input type='button' value=' ' onClick='history.go(-1)'></p>");
out
.println("<table border=0 cellPadding='5' cellSpacing='2' class='listtable' align='center' style='width:80%'><tr class='firstline'><td width='200px'align='center'> </td><td width='60px' align='center'> </td><td width='100' align='center'> </td><td align='center'> </td></tr>");
for (int i = 0; i < arr1.size(); i++) { //
//tempStr += arr.get(i).toString();
arr3 = (ArrayList) arr1.get(i);
out.print("<tr class='line'>");
for (int j = 0; j < arr3.size(); j++) {
out.print("<td>");
String tempstr = arr3.get(j).toString();
if (j == 0) {
if (path.length() > 1) {
out.print("<a href='main.jsp?path=" + path + "/"
+ tempstr + "'>" + tempstr + "</a>");
} else {
out.print("<a href='main.jsp?path=" + path
+ tempstr + "'>" + tempstr + "</a>");
}
} else {
out.print(tempstr);
}
out.print("</td>");
}
out.print("<td> </td></tr>");
}
String filename = null;
for (int i = 0; i < arr2.size(); i++) { //
//tempStr += arr.get(i).toString();
arr3 = (ArrayList) arr2.get(i);
out.print("<tr class='line'>");
for (int j = 0; j < arr3.size(); j++) {
out.print("<td>");
String tempstr = arr3.get(j).toString();
if (j == 0) {
filename = tempstr;
//out.print("<a href='#' onClick='selecturl();return false;'</a>" + tempstr);
out.print("<a href='downloadfile.jsp?path=" + path
+ "&filename=" + filename + "'>" + tempstr
+ "</a>");
//session.setAttribute("filename",filename);
} else {
out.print(tempstr);
}
out.print("</td>");
}
out
.print("<td width='100px' align='center'><a href='downloadfile.jsp?path="
+ path
+ "&filename="
+ filename
+ "'> </a></td></tr>");
//out.print("<td width='100px' align='center'><a href='#' onclick='selecturl();return false;'> </a></td></tr>");
}
out.print("</table>");
//messageOut = tempStr.toCharArray();
//out.println(tempStr+"cccc");
//out.println(messageOut.toString()+"ddddddddddd");
ft.stop(path);
ft = null;
%>
</form>
</body>
<script language='javascript'>
function selecturl()
{
//alert("xxxx");
}
</script>
</html>
、 downloadfile.jsp , FTP , edtftpj-1.5.4.jar lib , :http://www.enterprisedt.com/, :
<%@ page contentType="text/html; charset=GBK"%>
<%@ page language="java" import="java.io.IOException" pageEncoding="GBK"%>
<%@ page import="com.enterprisedt.net.ftp.FTPClient"%>
<%@ page import="com.enterprisedt.net.ftp.FTPTransferType"%>
<%@ page import="java.io.*,com.enterprisedt.net.ftp.FTPConnectMode;"%>
<html>
<head>
<title> </title>
</head>
<body>
<%
String path = null;
String filename = null;
path = request.getParameter("path");
filename = request.getParameter("filename");
//response.setContentType("application/unknown");// application/x-download
// %20 UTF-8
//filename = URLEncoder.encode(filename, "UTF-8");
//filename = new String(filename.getBytes("gb2312"),"ISO8859-1");
//response.setHeader("Content-Disposition", "attachment; filename=/"" + filename + "/";");
String host = "192.168.12.49";
String users = "admin";
String passwords = "admin";
if (path.trim().length() > 1) {
path = path.trim() + "/";
}
String remoteFile = path + filename; //
String downFile = "d:/" + filename; //
System.out.println(remoteFile + " , ................");
try {
OutputStream outputStream = response.getOutputStream();
FTPClient client = new FTPClient();
client.setRemoteHost(host);
//client.setDetectTransferMode(true);
client.connect();
client.login(users, passwords);
client.setConnectMode(FTPConnectMode.ACTIVE);
client.setType(FTPTransferType.BINARY);
//client.get(outputStream, remoteFile); //* : ftp , response(outputStream), response ,
//*
client.get(downFile, remoteFile); //* : FTP , D
outputStream.close();
client.quit();
} catch (IOException e) {
e.printStackTrace();
}
%>
</body>
</html>
http://blog.csdn.net/xiaoxiaohai123/article/details/1666511
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JSP| EL (Experession Language)텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.