Search

파일 μ—…λ‘œλ“œ

파일 μ—…λ‘œλ“œ

1.
μ•Œμ•„μ•Ό ν•  것
a.
HTTP - Content-Type 헀더
b.
form νƒœκ·Έμ˜ enctype 속성
i.
application/x-www-form-urlencoded
ii.
multipart/form-data
2.
파일 μ—…λ‘œλ“œ 라이브러리
3.
μ‹€μŠ΅ μ½”λ“œ
4.
ν…ŒμŠ€νŠΈ
5.
μ‘μš© μ‹€μŠ΅
a.
κ²Œμ‹œνŒ 파일 μ—…λ‘œλ“œ

μ•Œμ•„μ•Ό ν•  것

HTTP - Content-Type 헀더

1.
HTTP
2.
Content-Type 헀더

HTTP

μ›Ή μƒμ—μ„œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” ν”„λ‘œν† μ½œλ‘œ, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 톡신 κ·œμ•½
β€’
μš”μ²­(Request) : ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ μžμ›μ„ μš”μ²­ν•˜λŠ” ν–‰μœ„
β€’
응닡(Response) : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λŒ€ν•˜μ—¬ μ„œλ²„κ°€ μžμ›μ„ μ œκ³΅ν•΄μ£ΌλŠ” ν–‰μœ„
μš”μ²­κ³Ό 응닡은 각각 HTTP 톡신 κ·œμ•½μ— λ§žλŠ” μš”μ²­ λ©”μ‹œμ§€μ™€ 응닡 λ©”μ‹œμ§€λ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€.

μš”μ²­ & 응닡 λ©”μ‹œμ§€ κ΅¬μ„±μš”μ†Œ

β€’
μš”μ²­ λ©”μ‹œμ§€
β€’
응닡 λ©”μ‹œμ§€

μš”μ²­ λ©”μ‹œμ§€

ꡬ성 μš”μ†Œ
μ„€λͺ…
μš”μ²­ 라인(Request Line)
μš”μ²­ λ©”μ„œλ“œ, μš”μ²­ URI, HTTP 버전을 ν¬ν•¨ν•©λ‹ˆλ‹€.
μš”μ²­ 헀더(Request Headers)
μš”μ²­μ— λŒ€ν•œ 정보λ₯Ό ν¬ν•¨ν•˜λŠ” ν—€λ”λ“€μž…λ‹ˆλ‹€.
빈 쀄(CRLF)
μš”μ²­ 헀더와 λ³Έλ¬Έ(body)을 κ΅¬λΆ„ν•˜λŠ” 빈 μ€„μž…λ‹ˆλ‹€.
λ³Έλ¬Έ(body)
μš”μ²­ μ‹œμ— μ„œλ²„λ‘œ μ „μ†‘λ˜λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€. (POST λ©”μ„œλ“œμ—μ„œ μ‚¬μš©λ¨)

μš”μ²­ λ©”μ‹œμ§€ μ˜ˆμ‹œ

GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml Connection: keep-alive
Plain Text
볡사
μœ„μ˜ μ˜ˆμ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ /index.html νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λŠ” GET μš”μ²­ λ©”μ‹œμ§€μž…λ‹ˆλ‹€. μš”μ²­ λΌμΈμ—λŠ” μš”μ²­ λ©”μ„œλ“œ(GET), μš”μ²­ URI(/index.html), HTTP 버전(1.1)이 ν¬ν•¨λ˜μ–΄ 있으며, μš”μ²­ ν—€λ”μ—λŠ” Host, User-Agent, Accept, Connection λ“±μ˜ 정보가 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ 빈 쀄(CRLF)이 μš”μ²­ 헀더와 본문을 κ΅¬λΆ„ν•©λ‹ˆλ‹€.

응닡 λ©”μ‹œμ§€

ꡬ성 μš”μ†Œ
μ„€λͺ…
μƒνƒœ 라인(Status Line)
μƒνƒœ μ½”λ“œ, μƒνƒœ λ©”μ‹œμ§€, HTTP 버전을 ν¬ν•¨ν•©λ‹ˆλ‹€.
응닡 헀더(Response Headers)
응닡에 λŒ€ν•œ 정보λ₯Ό ν¬ν•¨ν•˜λŠ” ν—€λ”λ“€μž…λ‹ˆλ‹€.
빈 쀄(CRLF)
응닡 헀더와 λ³Έλ¬Έ(body)을 κ΅¬λΆ„ν•˜λŠ” 빈 μ€„μž…λ‹ˆλ‹€.
λ³Έλ¬Έ(body)
μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘λ˜λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€.

응닡 λ©”μ‹œμ§€ μ˜ˆμ‹œ

HTTP/1.1 200 OK Date: Wed, 06 Apr 2024 12:00:00 GMT Server: Apache Content-Length: 1234 Content-Type: text/html; charset=utf-8 <!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <h1>Hello, World!</h1> </body> </html>
Plain Text
볡사
μœ„μ˜ μ˜ˆμ‹œλŠ” μ„œλ²„λ‘œλΆ€ν„° 받은 HTTP 200 OK 응닡 λ©”μ‹œμ§€μž…λ‹ˆλ‹€. μƒνƒœ λΌμΈμ—λŠ” μƒνƒœ μ½”λ“œ(200), μƒνƒœ λ©”μ‹œμ§€(OK), HTTP 버전(1.1)이 ν¬ν•¨λ˜μ–΄ 있으며, 응닡 ν—€λ”μ—λŠ” Date, Server, Content-Length, Content-Type λ“±μ˜ 정보가 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ 빈 쀄(CRLF)이 응닡 헀더와 본문을 κ΅¬λΆ„ν•˜λ©°, λ³Έλ¬Έμ—λŠ” HTML νŽ˜μ΄μ§€μ˜ λ‚΄μš©μ΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Content-Type 헀더

HTTP λ©”μ‹œμ§€μ—μ„œ μ „λ‹¬λ˜λŠ” μ»¨ν…μΈ μ˜ νƒ€μž…μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ν…μŠ€νŠΈ, 이미지, λ™μ˜μƒ λ“±μ˜ 데이터 μœ ν˜•μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.

κΈ°λ³Έ Content-Type 헀더

μœ ν˜•
ν‚€μ›Œλ“œ
μ„€λͺ…
ν…μŠ€νŠΈ
text/plain
평문 ν…μŠ€νŠΈλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
text/html
HTML λ¬Έμ„œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
text/css
CSS μŠ€νƒ€μΌ μ‹œνŠΈλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
text/javascript
JavaScript μ½”λ“œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
이미지
image/jpeg
JPEG 이미지λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
image/png
PNG 이미지λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
image/gif
GIF 이미지λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
λ™μ˜μƒ
video/mp4
MP4 λ™μ˜μƒ νŒŒμΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
video/webm
WebM λ™μ˜μƒ νŒŒμΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
video/quicktime
QuickTime λ™μ˜μƒ νŒŒμΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
기타
application/json
JSON 데이터λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
application/xml
XML 데이터λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
application/octet-stream
이진 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μœΌλ‘œ, 주둜 일반 νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ μ—…λ‘œλ“œν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

form νƒœκ·Έμ˜ enctype 속성

μ„œλ²„λ‘œ 데이터λ₯Ό 전솑할 λ•Œ λ°μ΄ν„°μ˜ 인코딩 방식을 μ§€μ •ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.
1.
application/x-www-form-urlencoded
2.
multipart/form-data
Content-Type (ecntype)
νŠΉμ§•
application/x-www-form-urlencoded
폼 데이터λ₯Ό URL μΈμ½”λ”©ν•˜μ—¬ 전솑함. 주둜 ν…μŠ€νŠΈ 데이터 전솑에 μ‚¬μš©λ¨.
multipart/form-data
폼 데이터λ₯Ό μ—¬λŸ¬ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ„μ–΄ 전솑함. 파일 μ—…λ‘œλ“œμ™€ 같은 이진 데이터 전솑에 μ‚¬μš©λ¨.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Upload Example</title> </head> <body> <h2>파일 μ—…λ‘œλ“œ</h2> <form action="/upload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file" id="file"> <button type="submit">μ—…λ‘œλ“œ</button> </form> </body> </html>
HTML
볡사
파일 μ—…λ‘œλ“œλ₯Ό ν•˜κΈ° μœ„ν•΄μ„œλŠ” enctype=”multiart/form-data” λ₯Ό μ§€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.
input type=”file” νƒœκ·Έλ₯Ό μ΄μš©ν•˜μ—¬ νŒŒμΌμ„ μ²¨λΆ€ν•©λ‹ˆλ‹€.
action=β€μš”μ²­ κ²½λ‘œβ€ 속성에 μ§€μ •ν•œ 경둜둜 νŒŒμΌμ„ μ „μ†‘ν•©λ‹ˆλ‹€.
일반적으둜 HTML <form> μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„λ‘œ 데이터λ₯Ό 전솑할 λ•ŒλŠ” application/x-www-form-urlencodedλ‚˜ multipart/form-data 두 가지 인코딩 방식을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ νŒŒμΌμ„ μ—…λ‘œλ“œν•  λ•ŒλŠ” multipart/form-dataλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” 파일 데이터λ₯Ό μ„œλ²„λ‘œ μ „μ†‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν‘œμ€€ λ°©μ‹μž…λ‹ˆλ‹€.
μ—¬κΈ°μ„œ [μ—…λ‘œλ“œ] λ²„νŠΌμ„ λˆ„λ₯΄λ©΄, action 속성에 μž‘μ„±λœ μš”μ²­ 경둜둜 μ—…λ‘œλ“œ μš”μ²­μ΄ μ „μ†‘λ©λ‹ˆλ‹€.

파일 μ—…λ‘œλ“œ 라이브러리

JSP ν”„λ‘œμ νŠΈ(Dynamic Web Project)μ—μ„œ 주둜 μ‚¬μš©ν•˜λŠ” 파일 μ—…λ‘œλ“œ 라이브러리λ₯Ό μ†Œκ°œν•©λ‹ˆλ‹€.
β€’
cos.jar
β€’
commons
β—¦
commons-fileupload.jar
β—¦
commons-io.jar

μ‹€μŠ΅ μ½”λ“œ

β€’
라이브러리 μΆ”κ°€
β€’
index.jsp
β€’
upload.jsp

라이브러리 μΆ”κ°€

1.
commons-io.jar 라이브러리 λ‹€μš΄λ‘œλ“œ

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>파일 μ—…λ‘œλ“œ</title> </head> <body> <h2>파일 μ—…λ‘œλ“œ</h2> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file" id="file"> <button type="submit">μ—…λ‘œλ“œ</button> </form> </body> </html>
HTML
볡사

upload.jsp

<%@page import="java.io.File"%> <%@page import="java.util.UUID"%> <%@page import="java.util.Iterator"%> <%@page import="org.apache.commons.fileupload.FileItem"%> <%@page import="java.util.List"%> <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = "C:\\UPLOAD"; DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(10*1000*1000); // 10MB - 파일 μ΅œλŒ€ 크기 List<FileItem> items = upload.parseRequest(request); Iterator params = items.iterator(); while( params.hasNext() ) { FileItem item = (FileItem) params.next(); String value = item.getString("utf-8"); // 일반 데이터 if( item.isFormField() ) { out.println(item.getFieldName() + " : " + value); } // 파일 데이터 else { String fileName = item.getName(); String filePath = ""; // 파일 쀑볡 방지 - 파일λͺ… : 5a3089e0-22_강아지.jpg fileName = UUID.randomUUID().toString().substring(0, 11) + "_" + fileName; // 파일 전체 경둜 - 파일경둜 : C:\\UPLOAD\\5a3089e0-22_강아지.jpg File file = new File(path + "/" + fileName); filePath = file.getPath(); long fileSize = item.getSize(); // 파일 데이터 byte[] fileData = item.getInputStream().readAllBytes(); // 파일 μ—…λ‘œλ“œ (μ €μž₯) item.write(file); } } %>
HTML
볡사

ν…ŒμŠ€νŠΈ