Java Multipart란?
Java에서 Multipart란 여러 종류의 데이터를 하나의 HTTP 요청으로 전송하는 방법 중 하나입니다. 일반적으로 파일 업로드나 HTML 폼 데이터 전송 등에 사용됩니다. Multipart 요청은 MIME(Multipurpose Internet Mail Extensions) 형식을 따라 여러 부분으로 나뉘어 있습니다.
Java에서 Multipart를 다루기 위해서는 주로 `javax.mail` 또는 `org.apache.http.entity.mime` 패키지를 사용합니다. 각각의 패키지는 다음과 같은 목적으로 사용됩니다:
1. **javax.mail**:
- 이 패키지는 이메일과 관련된 기능을 지원합니다. 이메일의 첨부 파일을 처리하기 위해 사용할 수 있습니다. `javax.mail`은 JavaMail API의 일부이며, Multipart를 처리하기 위한 `javax.mail.internet.MimeMultipart` 클래스가 포함되어 있습니다.
2. **org.apache.http.entity.mime**:
- 이 패키지는 Apache HttpComponents 라이브러리의 일부로 제공됩니다. HTTP 요청과 응답을 다루는 데 사용됩니다. 이 라이브러리는 Multipart 업로드를 지원하는데, 주로 웹 애플리케이션에서 HTTP 요청을 처리할 때 사용됩니다. `org.apache.http.entity.mime.MultipartEntityBuilder` 클래스를 사용하여 Multipart 엔터티를 생성할 수 있습니다.
Multipart를 사용하여 데이터를 전송할 때는 다음과 같은 단계를 따릅니다:
1. Multipart 객체 생성: `javax.mail.internet.MimeMultipart` 또는 `org.apache.http.entity.mime.MultipartEntityBuilder`를 사용하여 Multipart 객체를 생성합니다.
2. 필요한 파트 추가: Multipart 객체에 텍스트나 파일 등의 파트를 추가합니다. 텍스트 파트는 `javax.mail.internet.MimeBodyPart` 또는 `org.apache.http.entity.mime.content.StringBody`를 사용하여 생성하고, 파일 파트는 `javax.mail.internet.MimeBodyPart` 또는 `org.apache.http.entity.mime.content.FileBody`를 사용하여 생성합니다.
3. HTTP 요청에 Multipart 객체 설정: HTTP 요청의 엔터티로 Multipart 객체를 설정합니다. 이를 위해서는 `javax.mail.internet.MimeMessage`를 사용하여 이메일 전송 시 MIME 메시지를 생성하거나, Apache HttpComponents의 `org.apache.http.client.methods.HttpPost` 등을 사용하여 HTTP POST 요청을 생성합니다.
Multipart를 사용하는 코드 예시는 다음과 같습니다:
**javax.mail을 이용한 예시:**
```java
import javax.mail.internet.MimeMultipart;
MimeMultipart multipart = new MimeMultipart();
// Add text part
multipart.addBodyPart(textPart);
// Add file part
multipart.addBodyPart(filePart);
```
**Apache HttpComponents를 이용한 예시:**
```java
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.client.methods.HttpPost;
HttpPost post = new HttpPost(url);
// Create Multipart entity
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// Add text part
builder.addTextBody("text", "Hello, world!");
// Add file part
builder.addBinaryBody("file", new File("example.txt"));
// Set Multipart entity to HTTP post request
post.setEntity(builder.build());
```
이렇게하면 Multipart 형식으로 데이터를 포함하는 HTTP 요청을 보낼 수 있습니다.
MultipartRequest 파일 업로드
Multipart 요청을 사용하여 파일을 업로드하는 방법은 Java 웹 애플리케이션에서 자주 사용됩니다. 일반적으로 파일 업로드를 처리하는 데는 Servlet을 사용합니다. 아래에는 Servlet을 사용하여 파일을 업로드하는 과정을 단계별로 설명하겠습니다.
1. **HTML 폼 생성**: 파일을 업로드하기 위한 HTML 폼을 생성합니다. 폼은 `<form>` 요소를 사용하여 생성하고, `enctype="multipart/form-data"` 속성을 사용하여 멀티파트 요청을 지정합니다.
```html
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
```
2. **Servlet 작성**: 파일 업로드를 처리하기 위한 Servlet을 작성합니다. 이 Servlet은 `javax.servlet.http.HttpServlet`을 상속받아 구현됩니다.
```java
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 폼으로부터 파일 파트 추출
Part filePart = request.getPart("file");
// 파일 이름 추출
String fileName = getFileName(filePart);
// 파일 저장 경로 설정
String savePath = "C:/uploads/" + fileName;
// 파일 저장
try (InputStream inputStream = filePart.getInputStream();
OutputStream outputStream = new FileOutputStream(savePath)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
// 업로드 완료 페이지로 리다이렉트
response.sendRedirect("upload-success.jsp");
}
// 파일 이름 추출 메서드
private String getFileName(Part part) {
String contentDisp = part.getHeader("content-disposition");
String[] tokens = contentDisp.split(";");
for (String token : tokens) {
if (token.trim().startsWith("filename")) {
return token.substring(token.indexOf("=") + 2, token.length() - 1);
}
}
return "";
}
}
```
3. **업로드된 파일 처리**: `doPost()` 메서드에서 업로드된 파일을 처리합니다. `request.getPart("file")` 메서드를 사용하여 파일 파트를 가져올 수 있습니다. 파일 파트에서 파일 이름을 추출하고, `getInputStream()`을 사용하여 파일 내용을 읽어올 수 있습니다. 이후 파일을 원하는 경로에 저장하거나 추가적인 처리를 수행할 수 있습니다.
4. **웹 애플리케이션 설정**: `web.xml` 파일이나 Servlet 3.0 이상을 지원하는 경우에는 `@WebServlet` 어노테이션을 사용하여 Servlet을 매핑합니다.
이제 위의 단계를 따라하면 HTML 폼을 통해 파일을 업로드할 수 있고, Servlet을 통해 업로드된 파일을 처리할 수 있습니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
SSH란? (putty, xshell 등등) (0) | 2024.04.18 |
---|---|
HTTP 요청 request란? (0) | 2024.04.16 |
React로 웹페이지 만드는 방법 (0) | 2024.04.09 |
URL 직접 접근 제한하는 방법(feat. 인증, IP, HTTP 제한 등) (0) | 2024.04.09 |
구글 SEO 상위 노출 원론적인 방법 (1) | 2024.04.03 |