본문 바로가기
Code/Web

[JSP Code] 파일 업로드 및 조회

by 스응 2023. 4. 6.
728x90
728x90

#  관련 포스팅

  - 파일 업로드 : https://young0105.tistory.com/178

 


 

오늘 배운 파일 업로드 방법을 복습할 겸 전자 도서관 프로젝트에 이미지 리뷰 기능을 추가했다.

 

#  이미지를 포함한 리뷰 작성

더보기

Controller

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
        // 리뷰 작성
        } else if ("writeReview".equals(action)) {
            int bookId = Integer.parseInt(request.getParameter("bookId"));
            int star = Integer.parseInt(request.getParameter("star"));
            String title = request.getParameter("title");
            String content = request.getParameter("content");
            Part filePart = request.getPart("file");
            
            int responseType = 0;
            // 도서명을 선택하지 않았다면 (-1)
            if (bookId == -1) {
                responseType = 2;
            } else {
                ReviewDTO reviewDto = new ReviewDTO(userId, bookId, star, title, content);
                responseType = reviewService.writeReview(reviewDto);
                
                // 이미지가 있다면
                if (filePart.getSubmittedFileName().equals(""== false) {
                    InputStream fileContent = filePart.getInputStream();
                    OutputStream outputStream = null;
                    try {
                        UUID uuid = UUID.randomUUID();
                        String uuidImage = uuid + "_" + filePart.getSubmittedFileName();
                        
                        String imgDir = getServletContext().getInitParameter("imgDir");
                        
                        File file = new File(imgDir, uuidImage);
                        outputStream = new FileOutputStream(file);
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = fileContent.read(buffer)) != -1) {
                            outputStream.write(buffer, 0length);
                        }
                        
                        // DB에 저장
                        ReviewDTO dto = reviewService.selectReviewByUserAndBook(userId, bookId);
                        int reviewId = dto.getId();
                        String originImage = filePart.getSubmittedFileName();
                        // uuidImage
                        
                        ReviewImageDTO reviewImageDTO = new ReviewImageDTO(reviewId, originImage, uuidImage);
                        reviewService.insertReviewImage(reviewImageDTO);
                        
                    } catch (Exception e) {
                        System.out.println("파일 이상");
                    } finally {
                        fileContent.close();
                        outputStream.flush();
                        
                        if (outputStream != null) {
                            outputStream.close();
                        }
                    }
                }
            }
            request.setAttribute("responseReview", responseType);
            // main.jsp로
cs

 

DAO

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    @Override
    public int insert(ReviewImageDTO reviewImageDTO) {
        int resultCount = 0;
        String sql = " INSERT INTO review_image VALUES (?, ?, ?) ";
        PreparedStatement pstmt = null;
        
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, reviewImageDTO.getReviewId());
            pstmt.setString(2, reviewImageDTO.getOriginImage());
            pstmt.setString(3, reviewImageDTO.getUuidImage());
            resultCount = pstmt.executeUpdate();
            
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return resultCount;
    }
cs

 

 

#  이미지 리뷰 조회

더보기

리뷰 조회 (이미지 포함 리뷰, 미포함 리뷰 구분)

 

1
2
3
4
5
6
7
8
9
<c:choose>
    <c:when test="${imageName != null}">
        <textarea cols="56" rows="10" readonly="readonly" class="content">${review.content}</textarea>                                
        <img alt="리뷰 이미지" src="/library/images/uploadImages/${imageName}" style="width: 212px; height: 262px; margin-left: 30px; border:1px solid gray">            
    </c:when>
    <c:otherwise>
        <textarea cols="83" rows="10" readonly="readonly" class="content">${review.content}</textarea>                                
    </c:otherwise>
</c:choose>
cs

 

DAO

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    @Override
    public ReviewImageDTO select(int reviewId) {
        ReviewImageDTO reviewImageDTO = null;
        String sql = " SELECT * FROM review_image WHERE review_id = ? ";
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, reviewId);
            rs = pstmt.executeQuery();
            
            while (rs.next()) {
                reviewImageDTO = new ReviewImageDTO();
                reviewImageDTO.setReviewId(rs.getInt("review_id"));
                reviewImageDTO.setOriginImage(rs.getString("origin_image"));
                reviewImageDTO.setUuidImage(rs.getString("uuid_image"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pstmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return reviewImageDTO;
    }
cs

 

 

ReviewImage 테이블을 따로 만들어서, review_id를 외래키로 받아 기본키로 사용하고

기존 파일명과 UUID가 포함된 파일명을 각각 테이블에 저장했다.

 

320x100
반응형

댓글