WEB
이미지 파일저장
NellKiM
2024. 11. 21. 10:01
1. 이미지 경로 저장 (추천)
- 데이터베이스에 이미지를 직접 저장하지 않고, 서버의 특정 디렉토리에 이미지를 저장한 후 해당 이미지 파일의 경로를 artist_img 컬럼에 저장하는 방법입니다.
- 이 방법은 데이터베이스의 크기를 효율적으로 관리하고 성능을 높이는 데 유리합니다.
구현 단계:
- 이미지 업로드 폼 작성 (JSP)
1. 이미지 경로 저장 (추천)
데이터베이스에 이미지를 직접 저장하지 않고, 서버의 특정 디렉토리에 이미지를 저장한 후 해당 이미지 파일의 경로를 artist_img 컬럼에 저장하는 방법입니다.
이 방법은 데이터베이스의 크기를 효율적으로 관리하고 성능을 높이는 데 유리합니다.
구현 단계:
이미지 업로드 폼 작성 (JSP)
jsp
코드 복사
<form action="uploadArtist" method="post" enctype="multipart/form-data">
<label for="artistName">Artist Name:</label>
<input type="text" name="artistName" id="artistName" required>
<label for="artistImg">Artist Image:</label>
<input type="file" name="artistImg" id="artistImg" accept="image/*" required>
<button type="submit">Upload</button>
</form>
서블릿에서 이미지 처리 및 저장
java
코드 복사
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.*;
import java.sql.*;
@MultipartConfig // 파일 업로드를 처리하기 위한 어노테이션
public class UploadArtistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String artistName = request.getParameter("artistName");
Part filePart = request.getPart("artistImg"); // 업로드된 파일을 가져옴
String fileName = getFileName(filePart);
// 저장할 경로 설정
String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();
// 파일 저장
String filePath = uploadPath + File.separator + fileName;
filePart.write(filePath);
// DB에 경로 저장
try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO MusicArtist (artist_name, artist_img) VALUES (?, ?)")) {
pstmt.setString(1, artistName);
pstmt.setString(2, "uploads/" + fileName); // 경로만 저장
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
response.getWriter().println("Artist uploaded successfully.");
}
// 파일명 추출
private String getFileName(Part part) {
for (String content : part.getHeader("content-disposition").split(";")) {
if (content.trim().startsWith("filename")) {
return content.substring(content.indexOf("=") + 2, content.length() - 1);
}
}
return null;
}
}
이미지 표시
저장된 이미지의 경로를 통해 JSP에서 이미지를 표시할 수 있습니다.
jsp
코드 복사
<img src="uploads/artist_image.jpg" alt="Artist Image">
2. 이미지 데이터를 BLOB으로 저장 (직접 DB 저장)
이미지를 파일이 아닌 BLOB(Binary Large Object) 형태로 데이터베이스에 저장하는 방법입니다.
이미지 데이터를 DB에 직접 저장하면 별도의 파일 시스템을 관리할 필요가 없지만, DB 크기가 커질 수 있습니다.
테이블 수정
artist_img 컬럼을 BLOB 타입으로 변경해야 합니다.
sql
코드 복사
ALTER TABLE MusicArtist MODIFY artist_img BLOB;
서블릿 구현
이미지 업로드 및 저장
java
코드 복사
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.*;
import java.sql.*;
@MultipartConfig
public class UploadArtistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String artistName = request.getParameter("artistName");
Part filePart = request.getPart("artistImg");
try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO MusicArtist (artist_name, artist_img) VALUES (?, ?)")) {
pstmt.setString(1, artistName);
pstmt.setBlob(2, filePart.getInputStream()); // 이미지 데이터를 BLOB으로 저장
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
response.getWriter().println("Artist uploaded successfully.");
}
}
이미지 읽기 및 표시
DB에서 BLOB 데이터를 읽고 JSP에서 출력합니다.
java
코드 복사
@WebServlet("/getImage")
public class GetImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String artistId = request.getParameter("id");
try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
PreparedStatement pstmt = conn.prepareStatement("SELECT artist_img FROM MusicArtist WHERE artist_id = ?")) {
pstmt.setInt(1, Integer.parseInt(artistId));
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob("artist_img");
InputStream inputStream = blob.getBinaryStream();
int fileLength = inputStream.available();
response.setContentType("image/jpeg");
response.setContentLength(fileLength);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JSP에서 이미지 표시
jsp
코드 복사
<img src="getImage?id=1" alt="Artist Image">
어느 방법을 선택해야 할까?
이미지 경로 저장 (방법 1): 서버 디스크를 사용하며 성능과 유지보수가 더 쉽습니다. 추천!
이미지 BLOB 저장 (방법 2): DB 내에 모든 데이터를 중앙 집중화하고 싶을 때 사용합니다.
추가로 구현 과정이나 궁금한 점이 있으면 말씀해 주세요! 😊
- 서블릿에서 이미지 처리 및 저장
java
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.*;
import java.sql.*;
@MultipartConfig // 파일 업로드를 처리하기 위한 어노테이션
public class UploadArtistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String artistName = request.getParameter("artistName");
Part filePart = request.getPart("artistImg"); // 업로드된 파일을 가져옴
String fileName = getFileName(filePart);
// 저장할 경로 설정
String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();
// 파일 저장
String filePath = uploadPath + File.separator + fileName;
filePart.write(filePath);
// DB에 경로 저장
try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO MusicArtist (artist_name, artist_img) VALUES (?, ?)")) {
pstmt.setString(1, artistName);
pstmt.setString(2, "uploads/" + fileName); // 경로만 저장
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
response.getWriter().println("Artist uploaded successfully.");
}
// 파일명 추출
private String getFileName(Part part) {
for (String content : part.getHeader("content-disposition").split(";")) {
if (content.trim().startsWith("filename")) {
return content.substring(content.indexOf("=") + 2, content.length() - 1);
}
}
return null;
}
}
- 이미지 표시
- 저장된 이미지의 경로를 통해 JSP에서 이미지를 표시할 수 있습니다.
<img src="uploads/artist_image.jpg" alt="Artist Image">
2. 이미지 데이터를 BLOB으로 저장 (직접 DB 저장)
- 이미지를 파일이 아닌 BLOB(Binary Large Object) 형태로 데이터베이스에 저장하는 방법입니다.
- 이미지 데이터를 DB에 직접 저장하면 별도의 파일 시스템을 관리할 필요가 없지만, DB 크기가 커질 수 있습니다.
테이블 수정
artist_img 컬럼을 BLOB 타입으로 변경해야 합니다.
ALTER TABLE MusicArtist MODIFY artist_img BLOB;
서블릿 구현
- 이미지 업로드 및 저장
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.*;
import java.sql.*;
@MultipartConfig
public class UploadArtistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String artistName = request.getParameter("artistName");
Part filePart = request.getPart("artistImg");
try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO MusicArtist (artist_name, artist_img) VALUES (?, ?)")) {
pstmt.setString(1, artistName);
pstmt.setBlob(2, filePart.getInputStream()); // 이미지 데이터를 BLOB으로 저장
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
response.getWriter().println("Artist uploaded successfully.");
}
}
- 이미지 읽기 및 표시
- DB에서 BLOB 데이터를 읽고 JSP에서 출력합니다.
@WebServlet("/getImage")
public class GetImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String artistId = request.getParameter("id");
try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
PreparedStatement pstmt = conn.prepareStatement("SELECT artist_img FROM MusicArtist WHERE artist_id = ?")) {
pstmt.setInt(1, Integer.parseInt(artistId));
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob("artist_img");
InputStream inputStream = blob.getBinaryStream();
int fileLength = inputStream.available();
response.setContentType("image/jpeg");
response.setContentLength(fileLength);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}