
2025λ 4μ 18μΌ
| λ°©μ | μ€λͺ | μ₯μ | λ¨μ |
|---|---|---|---|
| DB (BLOB) | DBμ νμΌ μ체λ₯Ό μ μ₯ | νΈλμμ /λ°±μ μ©μ΄ | λμ©λ μ²λ¦¬ λΆμ ν© |
| FileSystem + κ²½λ‘λ§ DBμ μ₯ | νμΌμ μλ²μ μ μ₯, DBμλ κ²½λ‘λ§ μ μ₯ | μ±λ₯ μ°μ, λ¨μ μ²λ¦¬ | κ²½λ‘ κ΄λ¦¬ μ€ν¨ μ λΆμμ |
[1] μ¬μ©μ νμΌ μ ν or Drag & Drop
β
[2] JSμμ FormData κ΅¬μ± ν Axiosλ‘ μλ²μ POST μμ²
β
[3] UploadController β FileServiceImpl νΈμΆ β νμΌ μ μ₯
β
[4] λͺ©λ‘ μμ² β ListController β νμΌ μμ€ν
μμ λͺ©λ‘ μ‘°ν
β
[5] λ€μ΄λ‘λ μμ² μ β DownloadController β FileServiceImpl.download()
β
[6] νμΌ μ€νΈλ¦¬λ° ν μ¬μ©μ λΈλΌμ°μ λ‘ μ μ‘
@WebServlet("/file/upload")
@MultipartConfig(
fileSizeThreshold = 1024 * 1024,
maxFileSize = 1024 * 1024 * 5,
maxRequestSize = 1024 * 1024 * 20
)
req.setAttribute("message", "μ
λ‘λ μ±κ³΅!") λ±)String folderName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
String UploadPath = ROOT_PATH + "/" + UPLOAD_PATH + "/" + folderName + "/";
File dir = new File(UploadPath);
if (!dir.exists()) dir.mkdirs();
String filename = ... // μλ³Έ μ΄λ¦
String uuid = UUID.randomUUID().toString();
String newFileName = uuid + "_" + filename; // UUID μ μ©
part.write(UploadPath + newFileName);
String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
List<String> blocked = List.of("exe", "bat", "sh");
if (blocked.contains(ext)) throw new ServletException("νμ©λμ§ μλ νμΌ νμμ
λλ€.");
Map<String, List<File>> map = new LinkedHashMap<>();
for (File folder : uploadRoot.listFiles()) {
map.put(folder.getName(), Arrays.stream(folder.listFiles()).toList());
}
String path = ROOT_PATH + "/" + UPLOAD_PATH + "/" + folder + "/" + filename;
File file = new File(path);
if (!file.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "νμΌμ΄ μ‘΄μ¬νμ§ μμ΅λλ€.");
return false;
}
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
Map<String, List<File>> map = fileService.getFileList();
req.setAttribute("map", map);
req.getRequestDispatcher("/WEB-INF/view/file/list.jsp").forward(req, resp);
boolean isDownloaded = fileService.download(req, resp);
// μ§μ λ€μ΄λ‘λ μ²λ¦¬ (λ·° μμ)
<h1>FILE LIST</h1>
<%
Map<String,List<File>> map = (Map<String,List<File>>)request.getAttribute("map");
if (map != null) {
for (String folder : map.keySet()) {
%>
<h3><%= folder %></h3>
<%
for (File file : map.get(folder)) {
%>
<a href="/file/download?folder=<%= folder %>&filename=<%= file.getName() %>">
<%= file.getName() %>
</a><br/>
<%
}
out.println("<hr/>");
}
}
%>
HTML νΌμμ νμΌμ ν¬ν¨ν λ°μ΄ν°λ₯Ό μλ²λ‘ μ μ‘ν λ μ¬μ©νλ μΈμ½λ© λ°©μ
JSμμ νμΌ λ° λ°μ΄ν°λ₯Ό key-value μμΌλ‘ ꡬμ±νμ¬ μλ²μ 보λ΄λ κ°μ²΄
Universal Unique Identifier. μ€λ³΅λμ§ μλ κ³ μ ν λ¬Έμμ΄λ‘ νμΌλͺ μΆ©λμ λ°©μ§ν¨
λΈλΌμ°μ κ° νμΌμ μ΄μ§ μκ³ λ€μ΄λ‘λνκ² μ§μνλ μλ΅ ν€λ
multipart μμ²μμ νμΌ λλ νλ νλνλλ₯Ό μλ―Ένλ κ°μ²΄ (Servlet 3.0 μ΄μ μ§μ)
URLμ νκΈ, 곡백, νΉμλ¬Έμκ° λ€μ΄κ° κ²½μ° κΉ¨μ§μ λ°©μ§νκΈ° μν΄ μΈμ½λ© μ²λ¦¬νλ λ©μλ
μ΄μ μ΄ λ΄μ©μ Velogμ κ·Έλλ‘ λ³΅λΆν΄μ μ
λ‘λ κ°λ₯ν©λλ€! π
λ€μ νΈμμλ νμΌ μμ κΈ°λ₯ ꡬν, νμΌ κ²½λ‘ DB μ μ₯ λ° μ‘°ν, νμΌλͺ
μ κ·ν/보μ νν°λ§μ μ΄μ΄μ λ€λ£° μ μμ΄μ.
νμνλ©΄ λ°λ‘ λ§ν΄μ£ΌμΈμ! π