오랜만에 글을 작성한다... 한게 없어서 안적은 것도 아니고 포기한 것도 아니지만 뭔가를 글로 남기는 것이 상당히 어렵다는 것을 다시 한번 깨닫게 되었다. 토이프로젝트와 여러 실습 과제들이 있었지만 이번만 좀 건너뛰고 다음으로 이루어질 내용부터 적도록 하겠다.

놀랍게도 Java는 끝나고 JSP와 Servlet을 간단하게? 배우고 이제는 Spring으로 넘어가고 있다. 진도를 잘 따라가고 있냐고 물어본다면 아마도라고 대답하고 싶다.

File Upload

파일을 업로드하고 다운로드하는 사이트를 간단하게 구현해보는 시간을 가졌다. 물론 구현을 전부 한 것은 아니고 제공받았다.

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을 사용하는 것에 대해서 익숙하지 않다보니 어떤 식으로 구현을 해야하는지를 헤깔렸다.

profile
이따금씩 올라오는 개발자 블로그

0개의 댓글