파일 업로드, 다운로드 기능 구현
cos.jar 라는 라이브러리를 사용
파일을 업로드하면 내 Pc의 파일명과 서버에서 전송받는 파일의 파일명이 다르다.
여러 클라이언트가 a라는 파일을 올리면 각 다른 사람이 이름만 동일하게 파일을 올려도 파일명이 중복된다.
클라이언트 측에서 보내는 파일을 원본파일이라고 하고, 서버에서 받을 때는 원본파일에 새로운 이름을 붙여 파일명 중복을 막는다.
→ File Rename Policy(파일이름 중복 정책)
💡 form 태그에 enctype="multipart/form-data” 추가
- <form> 태그의 enctype 속성은 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시.
- 이 속성은 <form> 요소의 method 속성값이 “post”인 경우에만 사용.
HTML5 에서 enctype 세 가지
1. application/x-www-form-urlencoded : 기본값. 모든 문자들은 서버로 보내기 전 인코딩됨을 명시
2. multipart/form-date: 모든 문자를 인코딩하지 않음을 명시, 서버로 전송할때 사용
3. text/plain : 디버깅용, 공백을 +로 인코딩(실제 서비스에서 사용 X)
날짜, 시간으로 파일 이름을 저장하면 중복될 일이 없다!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
// MultipartRequest(request, 저장할 경로, 파일의 최대크기, 인코딩, 이름정책)
// MultipartRequest 객체 생성
String saveDirectory = application.getRealPath("Uploads");
int maxPostSize = 1024 * 1000; // (1MB)
String encoding = "UTF-8"; // 인코딩방식의 (거의)표준
try {
// MultipartRequest 객체 생성 => 파일 업로드 실행
MultipartRequest mr = new MultipartRequest(request, saveDirectory, maxPostSize, encoding);
// 새로운 파일명 생성
String fileName = mr.getFilesystemName("attachedFile"); // 현재 파일 이름 abc.txt
String ext = fileName.substring(fileName.lastIndexOf(".")); // 파일 확장자 .txt 를 가지고 오는 것
String now = new SimpleDateFormat("yyyymmdd_HmsS").format(new Date()); // 20230702123456
String newFileName = now + ext; // 20230702123456.txt
}catch(Exception e){
}
%>
MultipartRequest mr = new MultipartRequest(request,saveDirectory,maxPostSize,encoding);
에서 밑줄이 그어지는 오류가 뜬다.
이걸 시작으로 망한 오늘의 수업.. 이때까진 맥으로 수업을 들었는데
결국 학원 컴퓨터로 세팅했다ㅠㅠㅠㅠㅠ
학원PC에서도 엉망으로 설치해서 포트번호가 이렇게 됐다..
포트번호 1522
orcl1
1234
파일 업로드 기능
FileUpload 폴더
Download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.io.FileNotFoundException" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="utils.JSFunction" %>
<%
String saveDirectory = application.getRealPath("Uploads");
String saveFilename = request.getParameter("sName");
String originalFilename = request.getParameter("oName");
try{
File file = new File(saveDirectory,saveFilename);
InputStream inStream = new FileInputStream(file);
// 한글 파일명 깨짐 방지
String client = request.getHeader("User-Agent");
if (client.indexOf("WOW64") == -1) { // 익스플로워
originalFilename = new String(originalFilename.getBytes("UTF-8"), "ISO-8859-1");
}
else {
originalFilename = new String(originalFilename.getBytes("KSC5601"), "ISO-8859-1");
}
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment; filename=\"" + originalFilename + "\"");
response.setHeader("Content-Length","" + file.length());
OutputStream outStream = response.getOutputStream();
byte b[] = new byte[(int)file.length()];
int readBuffer = 0;
while((readBuffer = inStream.read(b)) > 0){
outStream.write(b,0,readBuffer);
}
inStream.close();
outStream.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
%>
FileList.jsp
<%@ page import="java.net.URLEncoder"%>
<%@ page import="java.util.List"%>
<%@ page import="fileupload.MyfileDAO"%>
<%@ page import="fileupload.MyfileDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
MyfileDAO dao = new MyfileDAO();
List<MyfileDTO> fileLists = dao.myFileList();
dao.close();
%>
<html>
<head><title>FileUpload</title></head>
<body>
<h2>DB에 등록된 파일 목록 보기</h2>
<a href="FileUploadMain.jsp">파일 등록하기</a>
<table border="1">
<tr>
<th>No</th><th>작성자</th><th>제목</th><th>카테고리</th>
<th>원본 파일명</th><th>저장된 파일명</th><th>작성일</th><th>첨부파일</th>
</tr>
<%
for(MyfileDTO f : fileLists ){
%>
<tr>
<td><%= f.getIdx() %></td>
<td><%= f.getName() %></td>
<td><%= f.getTitle() %></td>
<td><%= f.getCate() %></td>
<td><%= f.getOfile() %></td>
<td><%= f.getSfile() %></td>
<td><%= f.getPostdate() %></td>
<td>
<a href="Download.jsp?oName=<%= URLEncoder.encode(f.getOfile(),"UTF-8") %>&sName=<%=URLEncoder.encode(f.getSfile(),"UTF-8") %>">[다운로드]</a>
</td>
</tr>
<%} %>
</table>
</body>
</html>
FileUploadMain.jsp
<%@ 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>
<script>
function validateForm(form){
}
</script>
</head>
<body>
<h3>파일 업로드</h3>
<form name="fileForm" method="post" enctype="multipart/form-data"
action="UploadProcess.jsp" onsubmit="return validateForm(this);">
작성자 : <input type="text" name="name" value="머스트해브" /><br />
제목 : <input type="text" name="title" /><br />
카테고리(선택사항) :
<input type="checkbox" name="cate" value="사진" checked />사진
<input type="checkbox" name="cate" value="과제" />과제
<input type="checkbox" name="cate" value="워드" />워드
<input type="checkbox" name="cate" value="음원" />음원 <br />
첨부파일 : <input type="file" name="attachedFile" /> <br />
<input type="submit" value="전송하기" />
</form>
</body>
</html>
UploadProcess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.io.File" %>
<%@ page import="fileupload.MyfileDAO"%>
<%@ page import="fileupload.MyfileDTO"%>
<%
//MultipartRequest(request,저장할 경로,파일의최대대크기,인코딩,이름정책)
String saveDirectory = application.getRealPath("Uploads");
int maxPostSize = 1024 * 1000; //(1MB)
String encoding = "UTF-8";
try{
// MultipartRequest객체 생성 => 파일 업로드 실행
MultipartRequest mr = new MultipartRequest(request,saveDirectory,maxPostSize,encoding);
// 새로운 파일명 생성
String fileName = mr.getFilesystemName("attachedFile"); // 현재 파일 이름 abc.txt
String ext = fileName.substring(fileName.lastIndexOf(".")); // 파일 확장자 .txt
String now = new SimpleDateFormat("yyyyMMdd_HmsS").format(new Date()); // 20240101123456
String newFileName = now + ext; // 20240101123456.txt
File oldFile = new File(saveDirectory + File.separator + fileName);
File newFile = new File(saveDirectory + File.separator + newFileName);
oldFile.renameTo(newFile);
String name = mr.getParameter("name");
String title = mr.getParameter("title");
String[] cateArray = mr.getParameterValues("cate");
StringBuffer cateBuf = new StringBuffer();
if(cateArray == null){
cateBuf.append("선택 없음");
}else{
for(String s : cateArray){
cateBuf.append(s + ",");
}
}
MyfileDTO dto = new MyfileDTO();
dto.setName(name);
dto.setTitle(title);
dto.setCate(cateBuf.toString());
dto.setOfile(fileName);
dto.setSfile(newFileName);
MyfileDAO dao = new MyfileDAO();
int result = dao.insertFile(dto);
dao.close();
response.sendRedirect("FileList.jsp");
}catch(Exception e){
e.printStackTrace();
request.getRequestDispatcher("FileUploadMain.jsp").forward(request, response);
}
%>
DB에 파일 데이터가 들어간다.
맥에서 다시 세팅 시 참고)
자바 17버전, 톰켓 9버전, 강사님 파일로 실행
오라클 XE 맞춰주기
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0704 ~ 05(0708 모델 2 방식 게시판 수정까지) (1) | 2024.07.22 |
---|---|
UIUX _국비과정 0703 [서블릿부터 MVC방식까지] (1) | 2024.07.22 |
UIUX _국비과정 0701 [모델 2 방식, JSTL] (0) | 2024.07.11 |
UIUX _국비과정 0628 [게시판_페이징] (0) | 2024.07.10 |
UIUX _국비과정 0625 ~ 27 [게시판] (0) | 2024.07.10 |