JAVA

DB파일올리기2_JSP

장꾸꾸 2020. 11. 20. 15:31

**

아래는 FileDownload.java 에 setHeaderTypeEx와 transportEx를 추가한 모습

		setHeaderTypeEx(response, file);
		transportEx(new FileInputStream(file), response.getOutputStream(), file);
		
	}
	//파일 속성-------------------------------------------------------------------
	private void setHeaderTypeEx(HttpServletResponse response, File file) 
		throws UnsupportedEncodingException{
		
		response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
		response.setHeader("Content-Length", String.valueOf(file.length()));
	}	//숫자 => 문자형
	
	//파일 전송-------------------------------------------------------------------
	private void transportEx(FileInputStream fileInputStream, 
			  ServletOutputStream outputStream, File file) throws IOException{
		
	}
}

/*  Content-Disposition;attachment 
 *  : 브라우저 인식 파일확장자를 포함하여 모든 확장자의 파일들에 대해 
 *	   다운로드시 무조건 "파일 다운로드" 대화상자가 뜨도록 하는 헤더속성이다
 *
 *  Content-Length
 *   : HttpRequest Header에 포함되어 전달되어야 할때
 *     일정한 길이가 있는 경우 파일을 업로드/다운로드 하는경우
 *     
 *  application/msword로 전송하면  MS-WORD로 인식된다
 *  
 *  application/octet-stream : 8비트로 되어있는 일련의 데이타
 *  표준화된 파일의 형식을 잘 모르는 경우 표시하는 방식
 *  wav --> wav ,  bmp --> bmp로 전송됨
 */

파일다운로드가 가능하게 된다

 

 

 

 

 

 

 

결국 실패되긴 해도 다운로드가 시작된다. 제대로 실행되려면 한글처리 등 해줘야할 것들이 많음

 

 

**

아래와 같이 fileDownload.java/fileUpload.java(URL인코더 껴주기)를 바꿔준 뒤 fileUpload.jsp를 바꿔준다(그림)

toKor 메소드를 만들어서 한글제목도 보일 수 있도록 한다.

 

		
		setHeaderTypeEx(response, file);
		transportEx(new FileInputStream(file), response.getOutputStream(), file);
		
	}
	//파일 속성-------------------------------------------------------------------
	private void setHeaderTypeEx(HttpServletResponse response, File file) 
		throws UnsupportedEncodingException{
		
		response.setHeader("Content-Disposition", "attachment;filename=" + toKor(file.getName()));
		response.setHeader("Content-Length", String.valueOf(file.length()));
	}	//숫자 => 문자형
	
	
	//파일 전송-------------------------------------------------------------------
	private void transportEx(FileInputStream fileInputStream, 
			  ServletOutputStream outputStream, File file) throws IOException{
		
	}
	//한글처리--------------------------------------------------------------------
	public String toKor(String str)throws UnsupportedEncodingException{
		return new String(URLEncoder.encode(str,"UTF-8"));

 

 	<tr>
		<th height="30" bgcolor="#FFDC74">파일명1</th>
		<td><%=dto.getFilename1()%></td>
		<th height="30" bgcolor="#FFDC74">원래이름1</th>
		<td><a href="/file/download?clip=<%=URLEncoder.encode(multi.getFilesystemName("upload1"))%>">
		       <%=dto.getOriginalfilename1()%></a>
				&nbsp;&nbsp;&nbsp;<%=byteTranslater(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="/file/download?clip=<%=URLEncoder.encode(multi.getFilesystemName("upload2"))%>">
		        <%=dto.getOriginalfilename2()%></a>
			    &nbsp;&nbsp;&nbsp;<%=byteTranslater(dto.getFilesize2())%>
		</td>
 	</tr>

 

 

**try/catch문으로 묶고 BufferedInputStream/BufferedOutputStream도 설정해주면

이제 내용도 같이 들어온다.

 

내용까지 잘 들어오는 걸 확인할 수 있다

 

 

**

 

크롬에서 f12를 누르면 jsp로 들어오는 걸 알 수 있다. 

 

InputStream은 byte로 가져오겠다/ OutputStream은 byte로 내보내겠다/영문과 숫자 외에는 모두 2byte/

BufferedInputStream/BufferedOutputStream 관련은 아래 참고

hyeonstorage.tistory.com/238

 

[JAVA] ByteStream : BufferedInputStream / BufferedOutputStream (파일 복사 예제)

ByteStream : BufferedInputStream / BufferedOutputStream (파일 복사 예제) BufferedInputStream과 BufferedOutputStream은 FilterStream을 상속하여 실제 필터 기능을 제공하는 클래스이다. [JAVA] ByteStrea..

hyeonstorage.tistory.com

	//파일 전송-------------------------------------------------------------------
	private void transportEx(FileInputStream fileInputStream, 
			  ServletOutputStream outputStream, File file) throws IOException{
		
		BufferedInputStream bin=null;
		BufferedOutputStream bos=null;
		
		
		try {
			bin=new BufferedInputStream(fileInputStream);
			bos=new BufferedOutputStream(outputStream);
			
			byte[] buf=new byte[(int)file.length()];
			int read=0;
			
			while((read=bin.read(buf)) != -1) {
				bos.write(buf, 0, read);
			}
			
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			bos.close();
			bin.close();
		}
	}

 

서버에서 읽어서 복사해오는 과정이 위의 코드다.

 

 

더보기

전체코드

package controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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);
	
		
		setHeaderTypeEx(response, file);
		transportEx(new FileInputStream(file), response.getOutputStream(), file);
		
	}
	//파일 속성-------------------------------------------------------------------
	private void setHeaderTypeEx(HttpServletResponse response, File file) 
		throws UnsupportedEncodingException{
		
		response.setHeader("Content-Disposition", "attachment;filename=" + toKor(file.getName()));
		response.setHeader("Content-Length", String.valueOf(file.length()));
	}	//숫자 => 문자형
	
	//파일 전송-------------------------------------------------------------------
	private void transportEx(FileInputStream fileInputStream, 
			  ServletOutputStream outputStream, File file) throws IOException{
		
		BufferedInputStream bin=null;
		BufferedOutputStream bos=null;
		
		
		try {
			bin=new BufferedInputStream(fileInputStream);
			bos=new BufferedOutputStream(outputStream);
			
			byte[] buf=new byte[(int)file.length()];
			int read=0;
			
			while((read=bin.read(buf)) != -1) {
				bos.write(buf, 0, read);
			}
			
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			bos.close();
			bin.close();
		}
	}
	//한글처리--------------------------------------------------------------------
	public String toKor(String str)throws UnsupportedEncodingException{
		return new String(URLEncoder.encode(str,"UTF-8"));
	}
}

 

<%@page import="java.net.URLEncoder"%>
<%@page import="java.text.NumberFormat"%>
<%@page import="java.io.File"%>
<%@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"/>
<% 
 	String realFolder="";
	String saveFolder="/storage";
	ServletContext context=getServletContext();
	realFolder=context.getRealPath(saveFolder);
	System.out.println("실제 저장될 위치:" + realFolder); 
	
	String enctype="UTF-8";
	int maxsize=10*1024*1024;     //최대 업로드 할 byte수(5MB);
	
	MultipartRequest multi=new MultipartRequest(request, realFolder,
			                                    maxsize, enctype,
			                                    new DefaultFileRenamePolicy()); 
	
	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="/file/download?clip=<%=URLEncoder.encode(multi.getFilesystemName("upload1"))%>">
		       <%=dto.getOriginalfilename1()%></a>
				&nbsp;&nbsp;&nbsp;<%=byteTranslater(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="/file/download?clip=<%=URLEncoder.encode(multi.getFilesystemName("upload2"))%>">
		        <%=dto.getOriginalfilename2()%></a>
			    &nbsp;&nbsp;&nbsp;<%=byteTranslater(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>
</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>

 

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;
	}
}