JAVA

DB에 파일올리기_JSP

장꾸꾸 2020. 11. 20. 11:33

프로젝트 구성

 

 

cos.jar
0.05MB

 

 

 

lib파일에 넣어줄 cos

 

*TEST1

fileform.html
fileUpload.jsp

 

저장파일 경로로 들어가보면 잘 들어온 걸 확인할 수 있다.

 

*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>
				&nbsp;&nbsp;&nbsp;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>
			    &nbsp;&nbsp;&nbsp;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>
				&nbsp;&nbsp;&nbsp;<%=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>
			    &nbsp;&nbsp;&nbsp;<%=dto.getFilesize2()%>
		</td>
 	</tr>

 

 

처리를 안해줬기 때문에 파일을 1개만 넣게 되면 위와 같은 오류가 발생한다.
파일 2개를 다 넣어주면 제목과 내용 파일 모두 잘 올라간 것이 확인된다.

 

**TEST4**

file의 경우는 key, value로 구성되는 파라메터로 받을 수 없기 때문에 multipart/form-data로 받은 것.

이 경우에 제목과 내용을 가지고 오고 싶다면, 파일 업로드에서 request getParameter가 아니라 Multipartrequest를 통해야 한다.

 

byteTranslater.txt
0.00MB
fileform.html
0.00MB
fileUpload.html
0.00MB

 

 

 

텍스트 파일 내용을 fileUpload.jsp에 추가한다.

		<td><a href="">
		        <%=dto.getOriginalfilename2()%></a>
			    &nbsp;&nbsp;&nbsp;<%=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);
	
	}
}

 

 

경로에 잘 들어왔는지 확인