게으른 개발자의 끄적거림

Java Multipart란? MultipartRequest 파일 업로드

끄적잉 2024. 4. 15. 21:35
반응형

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을 통해 업로드된 파일을 처리할 수 있습니다.

반응형