[java] JAX-RS를 활용한 파일 업로드 및 다운로드 구현

이 글에서는 JAX-RS(Java API for RESTful Web Services)를 사용하여 파일 업로드와 다운로드를 구현하는 방법을 알아보겠습니다.

파일 업로드

파일 업로드를 구현하기 위해서는 multipart/form-data 형식의 POST 요청을 처리할 수 있어야 합니다. JAX-RS에서는 @FormDataParam 어노테이션을 사용하여 요청에서 전달되는 파일을 처리할 수 있습니다.

다음은 파일 업로드를 처리하는 예제 코드입니다.

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("/file")
public class FileResource {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
            @FormDataParam("file") InputStream fileInputStream,
            @FormDataParam("file") FormDataContentDisposition contentDispositionHeader) {

        // 파일을 저장하는 로직 작성
        // fileInputStream을 사용하여 파일을 저장하고, contentDispositionHeader를 사용하여 파일의 이름과 확장자를 가져올 수 있음

        return Response.status(200).entity("File uploaded successfully").build();
    }
}

위의 코드에서 @FormDataParam("file") 어노테이션은 요청에서 file이라는 이름으로 전달된 파일을 처리한다는 의미입니다. fileInputStream은 전달된 파일의 데이터를 읽기 위한 InputStream 객체이고, contentDispositionHeader는 전달된 파일의 이름과 확장자를 가져오는 객체입니다. 파일을 저장하는 로직을 작성할 때 이 두 가지 변수를 활용할 수 있습니다.

파일 다운로드

파일 다운로드를 구현하기 위해서는 클라이언트에게 파일의 내용과 파일의 메타데이터를 전달해야 합니다. JAX-RS에서는 Response 객체를 사용하여 파일을 전송할 수 있습니다.

다음은 파일 다운로드를 처리하는 예제 코드입니다.

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;

@Path("/file")
public class FileResource {

    @GET
    @Path("/{filename}")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response downloadFile(@PathParam("filename") String filename) {

        // 파일을 읽는 로직 작성
        // filename을 사용하여 서버에서 해당 파일을 읽어와야 함

        File file = new File(filename);

        return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
                .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"")
                .build();
    }
}

위의 코드에서 @Path("/{filename}") 어노테이션은 {filename}이라는 경로 변수를 사용하여 클라이언트로부터 요청된 파일의 이름을 가져옵니다. 파일을 읽은 후 Response 객체를 생성할 때 MediaType.APPLICATION_OCTET_STREAM으로 설정하여 바이너리 데이터로 응답을 전송합니다. Content-Disposition 헤더를 사용하여 응답 파일의 이름을 지정할 수 있습니다.

요약

JAX-RS를 사용하여 파일 업로드와 다운로드를 구현하는 방법을 알아보았습니다. @FormDataParam 어노테이션을 사용하여 파일을 업로드할 수 있고, Response 객체를 사용하여 파일을 다운로드할 수 있습니다.