DB파일올리기2_JSP
**
아래는 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>
<%=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>
<%=byteTranslater(dto.getFilesize2())%>
</td>
</tr>
**try/catch문으로 묶고 BufferedInputStream/BufferedOutputStream도 설정해주면
이제 내용도 같이 들어온다.
**
InputStream은 byte로 가져오겠다/ OutputStream은 byte로 내보내겠다/영문과 숫자 외에는 모두 2byte/
BufferedInputStream/BufferedOutputStream 관련은 아래 참고
[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>
<%=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>
<%=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;
}
}