** πŸ“ŒνŒŒμΌ μ—…λ‘œλ“œ κ΅¬ν˜„ **

JSP + Servlet ν™˜κ²½μ—μ„œ 이미지, μ²¨λΆ€νŒŒμΌ 등을 μ—…λ‘œλ“œν•˜κ³ 

μ„œλ²„μ— μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜λŠ” 전체 흐름과 예제 μ™„μ „ 정리


🧩 λͺ©μ°¨

  1. κ°œλ…: 파일 μ—…λ‘œλ“œλž€?
  2. 전체 흐름도
  3. enctype=”multipart/form-dataβ€λž€?
  4. μ—…λ‘œλ“œ 처리 방법 (cos.jar or commons-fileupload μ‚¬μš©)
  5. μ‹€μ „ 예제 μ½”λ“œ
  6. μ €μž₯ 경둜 및 파일λͺ… 처리
  7. 기술 λ©΄μ ‘ λŒ€λΉ„ 핡심 μš”μ•½
  8. 마무리 μš”μ•½ + Notion μž‘μ„± 팁

βœ… 1. κ°œλ…: 파일 μ—…λ‘œλ“œλž€?

ν•­λͺ© μ„€λͺ…
μ •μ˜ μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €μ—μ„œ μ„ νƒν•œ νŒŒμΌμ„ μ„œλ²„λ‘œ μ „μ†‘ν•˜κ³  μ €μž₯ν•˜λŠ” κ³Όμ •
μ‚¬μš© λͺ©μ  ν”„λ‘œν•„ 이미지, κ²Œμ‹œνŒ μ²¨λΆ€νŒŒμΌ, λ¬Έμ„œ μ—…λ‘œλ“œ λ“±
처리 방식 <form> νƒœκ·Έμ—μ„œ enctype="multipart/form-data" μ‚¬μš© ν•„μˆ˜

βœ… 2. 전체 흐름도

[1] form.jsp
 ⬇ (파일 선택 + form 전솑)
[2] UploadServlet
 ⬇ (MultipartRequest 처리)
[3] μ„œλ²„ κ²½λ‘œμ— 파일 μ €μž₯
 ⬇
[4] DB에 파일λͺ… μ €μž₯ or ν™”λ©΄ 좜λ ₯

βœ… 3. enctype=”multipart/form-dataβ€λž€?

ν•­λͺ© μ„€λͺ…
μ—­ν•  νŒŒμΌμ„ ν¬ν•¨ν•œ form 데이터λ₯Ό 일반 ν…μŠ€νŠΈκ°€ μ•„λ‹Œ λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μœΌλ‘œ 전솑
ν•„μˆ˜ 쑰건 <form method="post" enctype="multipart/form-data"> μ„€μ • μ‹œλ§Œ 파일 전솑 κ°€λŠ₯

βœ… 4. μ—…λ‘œλ“œ 처리 방법

βœ… κ°€μž₯ 많이 μ“°λŠ” 방법: cos.jar (MultipartRequest)

ν•­λͺ© μ„€λͺ…
클래슀 com.oreilly.servlet.MultipartRequest
ν•„μš” 라이브러리 cos.jar (μ›Ή ν”„λ‘œμ νŠΈ /WEB-INF/lib에 μΆ”κ°€)
μž₯점 κ°„λ‹¨ν•˜κ²Œ 파일 μ €μž₯ κ°€λŠ₯, 별도 Servlet μ„€μ • λΆˆν•„μš”
단점 λŒ€μš©λŸ‰ 파일, 파일 ν•„ν„° λ“± κ³ κΈ‰ κΈ°λŠ₯ λΆ€μ‘±

βœ… 5. μ‹€μ „ 예제 μ½”λ“œ


πŸ“„ [1] upload.jsp (μ—…λ‘œλ“œ 폼)

<form action="upload" method="post" enctype="multipart/form-data">
  파일 선택: <input type="file" name="uploadFile" /><br />
  <input type="submit" value="μ—…λ‘œλ“œ" />
</form>

πŸ“„ [2] UploadServlet.java

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    String savePath = request.getServletContext().getRealPath("/upload"); // μ €μž₯ 폴더 경둜
    int maxSize = 10 * 1024 * 1024; // μ΅œλŒ€ 10MB
    String encoding = "UTF-8";

    // cos.jar 기반 MultipartRequest 객체 생성
    MultipartRequest multi = new MultipartRequest(
      request,
      savePath,
      maxSize,
      encoding,
      new DefaultFileRenamePolicy() // 쀑볡 μ‹œ 파일λͺ… μžλ™ λ³€κ²½
    );

    // input name="uploadFile"의 파일 이름 μ–»κΈ°
    String fileName = multi.getFilesystemName("uploadFile");

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<h3>μ—…λ‘œλ“œ μ™„λ£Œ: " + fileName + "</h3>");
  }
}

βœ… ν”„λ‘œμ νŠΈμ— cos.jar μΆ”κ°€ 방법


βœ… 6. μ €μž₯ 경둜 및 파일λͺ… 처리 팁

ν•­λͺ© μ˜ˆμ‹œ/μ„€λͺ…
μ €μž₯ 경둜 getServletContext().getRealPath("/upload") = μ„œλ²„μ˜ μ‹€μ œ 경둜
쀑볡 λ°©μ§€ DefaultFileRenamePolicy() β†’ μžλ™μœΌλ‘œ 파일λͺ… λ³€κ²½ (예: photo.png β†’ photo1.png)
DB μ €μž₯ μ‹œ 파일λͺ…을 DB에 μ €μž₯ν•˜λ©΄ 이후 λ‹€μš΄λ‘œλ“œ/좜λ ₯에 ν™œμš© κ°€λŠ₯

βœ… 7. 기술 λ©΄μ ‘ λŒ€λΉ„ 핡심 μš”μ•½ πŸ’¬

질문 μš”μ  정리
파일 μ—…λ‘œλ“œ μ‹œ form 섀정은? method=”post” + enctype=”multipart/form-data”
Servletμ—μ„œ 파일 처리 ν΄λž˜μŠ€λŠ”? MultipartRequest (cos.jar)
μ €μž₯ κ²½λ‘œλŠ” μ–΄λ–»κ²Œ κ΅¬ν•˜λ‚˜μš”? getServletContext().getRealPath("/폴더")
파일 쀑볡 μ‹œ 처리 방법은? DefaultFileRenamePolicy() λ˜λŠ” UUID ν™œμš©
cos.jar 말고 λ‹€λ₯Έ 방법은? Apache commons-fileupload, Spring Multipart 지원 λ“±

βœ… 8. 마무리 μš”μ•½ πŸ§