오랜만에 글을 작성한다... 한게 없어서 안적은 것도 아니고 포기한 것도 아니지만 뭔가를 글로 남기는 것이 상당히 어렵다는 것을 다시 한번 깨닫게 되었다. 토이프로젝트와 여러 실습 과제들이 있었지만 이번만 좀 건너뛰고 다음으로 이루어질 내용부터 적도록 하겠다.
놀랍게도 Java는 끝나고 JSP와 Servlet을 간단하게? 배우고 이제는 Spring으로 넘어가고 있다. 진도를 잘 따라가고 있냐고 물어본다면 아마도라고 대답하고 싶다.
파일을 업로드하고 다운로드하는 사이트를 간단하게 구현해보는 시간을 가졌다. 물론 구현을 전부 한 것은 아니고 제공받았다.
H2라는 데이터베이스를 사용해서 사용자가 파일을 올리면 파일의 이름, 타입, 위치 등을 데이터베이스에 저장하고 이를 다시 불러와서 다운로드 창으로 넘기고... 실습했다. 이 과정에서 파일의 정보를 저장하는 데 데이터베이스를 어떻게 구성하는 것이 좋을까를 고민하다가 파일에 대한 정보는 파싱해서 넣는 것으로 정했다. 그래서 구현을 했고 Servlet을 사용해서 데이터를 주고받고 세션또한 로그인을 위해서 사용했다.
파일 읽고 파싱
public List<FileInfo> parseStringToFileInfoList(String string) {
List<FileInfo> fileInfoList = new LinkedList<>();
StringTokenizer stringTokenizer = new StringTokenizer(string, "\'");
List<String> tokens = new LinkedList<>();
int count = 0;
while (stringTokenizer.hasMoreTokens()) {
count++;
String str = stringTokenizer.nextToken();
if (count % 2 == 1) continue;
tokens.add(str);
FileInfo fileInfo = null;
if (tokens.size() == 4) {
fileInfo = new FileInfo();
fileInfo.setFileName(tokens.get(0));
fileInfo.setChangedFileName(tokens.get(1));
fileInfo.setFileType(tokens.get(2));
fileInfo.setFileLocation(tokens.get(3));
tokens.clear();
fileInfoList.add(fileInfo);
}
}
return fileInfoList;
}
Servlet
Post 방식으로 주고받음
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
String userId = "";
if (session.getAttribute("SESSION_ID") != null) {
userId = (String) session.getAttribute("SESSION_ID");
}
///////////////////////////////// 파일 업로드 /////////////////////////////////
ServletContext servletContext = getServletContext();
String uploadPath = servletContext.getRealPath("."); // 현재 서버가 실행 중인 위치
String uploadFolder = "upload";
String fullPath = uploadPath + File.separator + uploadFolder;
// upload 디렉토리 생성
File dir = new File(fullPath);
if (!dir.exists()) {
dir.mkdir(); // make directory
}
String encType = "UTF-8";
int maxSize = 5 * 1024 * 1024; // 5mb (업로드할 파일 최대 크기)
try {
MultipartRequest multipartRequest
= new MultipartRequest(request, fullPath, maxSize, encType,
new CustomRenamePolicy(fullPath));
// new DefaultFileRenamePolicy()); // a.txt, a1.txt, a2.txt
FilePost filePost = new FilePost();
//////////////// type="file"이 아닌 다른 요소의 값 ////////////////////
String title = "";
Enumeration<?> parameterNames = multipartRequest.getParameterNames();
if (parameterNames.hasMoreElements()) {
String name = (String)parameterNames.nextElement();
String value = multipartRequest.getParameter(name);
title = value;
}
////////////////// type="file"인 요소의 값 //////////////////////
List<FileInfo> fileInfoList = new LinkedList<>();
Enumeration<?> files = multipartRequest.getFileNames();
if (files.hasMoreElements()) {
String name = (String)files.nextElement();
String filename = multipartRequest.getFilesystemName(name);
// 서버에 저장된 file 이름 반환
// 만약에 중복된 이름이 서버에 저장이 되어있을 경우에는 DefaultFileRenamePolicy에 의해 변경된 파일 이름 반환
String originalFileName = multipartRequest.getOriginalFileName(name);
// 실제 file 이름 반환
// 만약에 중복된 이름이 서버에 저장이 되어있을 경우에는 DefaultFileRenamePolicy에 의해 변경되기 전의 원래 파일 이름 반환
String fileType = multipartRequest.getContentType(name);
// 파일 타입 반환
String fileLocation = ".." + File.separator + uploadFolder + File.separator + filename;
fileInfoList.add(new FileInfo(originalFileName, filename, fileType, fileLocation));
}
filePost.setUserId(userId);
filePost.setTitle(title);
filePost.setFiles(fileInfoList);
FilePostDAO filePostDAO = FilePostDAO.getInstance();
int res = filePostDAO.insert(filePost);
if (res > 0) {
session.setAttribute("filePost", filePost);
//response.sendRedirect("./file/fileView.jsp");
} else {
//response.sendRedirect("./file/fileSelect.jsp");
}
} catch (FileNotFoundException e) {
new RuntimeException();
} catch (IOException e) {
new RuntimeException();
}
}
생각보다 어려웠다. 특히 파싱을 하는 부분에서 아직까지는 String이나 StringTokenizer을 사용하는 것에 대해서 익숙하지 않다보니 어떤 식으로 구현을 해야하는지를 헤깔렸다.