DB에 파일올리기_JSP
lib파일에 넣어줄 cos
*TEST1
*jsp 파일에서 실행하려고 하면 내부서버오류가 남 500번 오류 이제 그만(html에서 실행)*
같은 이름의 파일을 올렸을 때 file1/file2로 되는 부분은 아래의 덮어쓰기 방지부분 때문이다.
<%
/* String realFolder="";
String saveFolder="/storage";
ServletContext context=getServletContext();
realFolder=context.getRealPath(saveFolder);
System.out.println("실제 저장될 위치:" + realFolder); */
String realFolder="C:/Users/EZEN/jsp_workspace/step10_FileProject/WebContent/storage";
String enctype="UTF-8";
int maxsize=5*1024*1024; //최대 업로드 할 byte수(5MB);
MultipartRequest multi=new MultipartRequest(request, realFolder,
maxsize, enctype,
new DefaultFileRenamePolicy());
// new DefaultFileRenamePolicy() => 기본보안
// 기존에 업로드된 파일명과 같은 파일이 있으면 덮어쓰기 방지
// ex) aa.txt aa1.txt aa2.txt
%>
전체코드
src
/controller
FileDownload.java
/dto
FileDTO.java
package dto;
//setter & getter
public class FileDTO {
private String subject;
private String content;
private String filename1;
private String filename2;
private String originalfilename1;
private String originalfilename2;
private long filesize1;
private long filesize2;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFilename1() {
return filename1;
}
public void setFilename1(String filename1) {
this.filename1 = filename1;
}
public String getFilename2() {
return filename2;
}
public void setFilename2(String filename2) {
this.filename2 = filename2;
}
public String getOriginalfilename1() {
return originalfilename1;
}
public void setOriginalfilename1(String originalfilename1) {
this.originalfilename1 = originalfilename1;
}
public String getOriginalfilename2() {
return originalfilename2;
}
public void setOriginalfilename2(String originalfilename2) {
this.originalfilename2 = originalfilename2;
}
public long getFilesize1() {
return filesize1;
}
public void setFilesize1(long filesize1) {
this.filesize1 = filesize1;
}
public long getFilesize2() {
return filesize2;
}
public void setFilesize2(long filesize2) {
this.filesize2 = filesize2;
}
}
/WebContent
fileform.html
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>Insert title here</title></head>
<body>
<form method="post" action="/file/fileUpload.jsp" enctype="multipart/form-data">
<table border="1" width="400" align="center">
<tr>
<td width="20%" align="center">제목</td>
<td width="80%">
<input type="text" name="subject" size="45">
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="content" cols="65" rows="15" scrollbars="no"></textarea>
</td>
</tr>
<tr>
<td colspan="2">
파일1 <input type="file" name="upload1" value="파일찾기" size="40%">
</td>
</tr>
<tr>
<td colspan="2">
파일2 <input type="file" name="upload2" value="파일찾기" size="40%">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="올리기">
<input type="reset" value="취소">
</td>
</tr>
</table>
</form>
</body>
</html>
fileform.jsp
fileUpload.jsp
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="dto" class="dto.FileDTO"/>
<!-- 자바코드
import dto.FileDTO;
FileDTO dto=new FileDTO();
-->
<%
/* String realFolder="";
String saveFolder="/storage";
ServletContext context=getServletContext();
realFolder=context.getRealPath(saveFolder);
System.out.println("실제 저장될 위치:" + realFolder); */
String realFolder="C:/Users/EZEN/jsp_workspace/step10_FileProject/WebContent/storage";
String enctype="UTF-8";
int maxsize=5*1024*1024; //최대 업로드 할 byte수(5MB);
MultipartRequest multi=new MultipartRequest(request, realFolder,
maxsize, enctype,
new DefaultFileRenamePolicy());
// new DefaultFileRenamePolicy() => 기본보안
// 기존에 업로드된 파일명과 같은 파일이 있으면 덮어쓰기 방지
// ex) aa.txt aa1.txt aa2.txt
%>
업로드 되었음
<table border="1" width="60%" align="center">
<tr>
<th height="40" bgcolor="#FFDC74">제목</th>
<td colspan="3" >test</td>
</tr>
<tr>
<th height="40" bgcolor="#FFDC74">내용</th>
<td colspan="3" >test</td>
</tr>
<tr>
<th height="30" bgcolor="#FFDC74">파일명1</th>
<td>file1</td>
<th height="30" bgcolor="#FFDC74">원래이름1</th>
<td><a href="">
file1</a>
100
</td>
</tr>
<tr>
<th height="30" bgcolor="#FFDC74">파일명2</th>
<td>file2</td>
<th height="30" bgcolor="#FFDC74">원래이름2</th>
<td><a href="">
file2</a>
200
</td>
</tr>
</table>
</body>
</html>
아래 그림은 가상 서버에 프로젝트가 잘 올라와있음을 확인하는 부분
* TEST2 *
realFolder에 가상서버를 박아놨지만(fileUpload.jsp) 실제 개발에서 서버의 환경이 윈도우가 아닐 수 있기 때문에 실무에서 아래처럼 하게 되면 오류가 난다.
String realFolder="C:/Users/EZEN/jsp_workspace/step10_FileProject/WebContent/storage";
--> 그렇기 때문에 아래와 같이 바꿔준다(기존의 주석부분을 가동) fileUpload.jsp
String realFolder="";
String saveFolder="/storage";
ServletContext context=getServletContext();
realFolder=context.getRealPath(saveFolder);
System.out.println("실제 저장될 위치:" + realFolder);
/* String realFolder="C:/Users/EZEN/jsp_workspace/step10_FileProject/WebContent/storage"; */
String enctype="UTF-8";
int maxsize=5*1024*1024; //최대 업로드 할 byte수(5MB);
MultipartRequest multi=new MultipartRequest(request, realFolder,
maxsize, enctype,
new DefaultFileRenamePolicy());
// new DefaultFileRenamePolicy() => 기본보안
// 기존에 업로드된 파일명과 같은 파일이 있으면 덮어쓰기 방지
// ex) aa.txt aa1.txt aa2.txt
*TEST3*
dto.setSubject(multi.getParameter("subject"));
dto.setContent(multi.getParameter("content"));
dto.setFilename1(multi.getFilesystemName("upload1"));
dto.setFilename2(multi.getFilesystemName("upload2"));
dto.setOriginalfilename1(multi.getOriginalFileName("upload1"));
dto.setOriginalfilename2(multi.getOriginalFileName("upload2"));
File file1 = multi.getFile("upload1");
File file2 = multi.getFile("upload2");
dto.setFilesize1(file1.length());
dto.setFilesize2(file2.length());
%>
업로드 되었음
<table border="1" width="60%" align="center">
<tr>
<th height="40" bgcolor="#FFDC74">제목</th>
<td colspan="3"><%=dto.getSubject()%></td>
</tr>
<tr>
<th height="40" bgcolor="#FFDC74">내용</th>
<td colspan="3"><%=dto.getContent()%></td>
</tr>
<tr>
<th height="30" bgcolor="#FFDC74">파일명1</th>
<td><%=dto.getFilename1()%></td>
<th height="30" bgcolor="#FFDC74">원래이름1</th>
<td><a href="">
<%=dto.getOriginalfilename1()%></a>
<%=dto.getFilesize1()%>
</td>
</tr>
<tr>
<th height="30" bgcolor="#FFDC74">파일명2</th>
<td><%=dto.getFilename2()%></td>
<th height="30" bgcolor="#FFDC74">원래이름2</th>
<td><a href="">
<%=dto.getOriginalfilename2()%></a>
<%=dto.getFilesize2()%>
</td>
</tr>
**TEST4**
file의 경우는 key, value로 구성되는 파라메터로 받을 수 없기 때문에 multipart/form-data로 받은 것.
이 경우에 제목과 내용을 가지고 오고 싶다면, 파일 업로드에서 request getParameter가 아니라 Multipartrequest를 통해야 한다.
텍스트 파일 내용을 fileUpload.jsp에 추가한다.
<td><a href="">
<%=dto.getOriginalfilename2()%></a>
<%=dto.getFilesize2()%>
</td>
</tr>
</table>
<%!
public static String byteTranslater(long size)
{
NumberFormat nf = NumberFormat.getIntegerInstance();
java.text.DecimalFormat df = new java.text.DecimalFormat("#,##0.00");
int intSize = 0;
int kbyteSize = 1024;
double doubleSize = 0;
String returnSize = null;
if (size >= (1000 * 1024 * 1024)) {
intSize = new Long(size / (1000 * 1024 * 1024)).intValue();
return nf.format(intSize) + "GB";
} else if (size > (kbyteSize * 1024)) {
intSize = (int) (((double) size) / ((double) (kbyteSize * 1024)) * 100);
doubleSize = (double) (((double) intSize) / 100);
returnSize = df.format(doubleSize);
if (returnSize.lastIndexOf(".") != -1) {
if ("00".equals(returnSize.substring(returnSize.length() - 2,
returnSize.length()))) {
returnSize = returnSize.substring(0, returnSize.lastIndexOf("."));
}
}
return returnSize + "MB";
} else if (size > kbyteSize) {
intSize = new Long(size / kbyteSize).intValue();
return nf.format(intSize) + "KB";
} else {
// return nf.format(size) + "Byte";
return "1KB";
}
}
%>
</body>
**TEST5** (max사이즈 10메가로 바꿔준 상태) 다운로드
다운로드로 가서 파일의 이름을 가져오는 것을 get!으로 가져온다.
혹시 post로 받는다면 아래와 같이 하기도 한다.
FileDownload.java를 다음과 같은 코드로 작성했기 때문에 Get/Post 둘다 가능하다.
package controller;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "Download", urlPatterns = { "/download" })
public class FileDownload extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path=getServletContext().getRealPath("/storage");
String filename=request.getParameter("clip");
System.out.println("파일명 :" + filename);
File file=new File(path+"/"+filename);
System.out.println("파일경로:" + file);
}
}