본문 바로가기

DevOps/Tomcat

[Tomcat] 톰캣 외부 경로 파일 업로드 - 컴도리돌이

728x90
728x90

 

외부에서 접근해야 하는 리소스를 webapp 폴더 하위에 있는 resource 파일 안에 저장을 하였습니다. 하지만 WAR 파일을 재배포할 때마다 업로드된 파일들이 사라지면서 재 업로드 해야 하는 경우가 있기에, 외부에서 접근하는 경로를 톰캣 상위 루트 경로로 변경하고, 서버에서도 업로드할 때 해당 루트 경로에 넣으려고 합니다. 


1. 서버에서 루트 경로로 파일 업로드 

 

Apache Commons FileUpload 및 서블릿 API 라이브러리 추가합니다. 

 

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version> 
    <scope>provided</scope>
</dependency>

 

'@WebServlet' 어노테이션은 서블릿을 정의하고 매핑하는 데 사용되는 Java EE 웹 어플리케이션에서 사용되는 어노테이션입니다. 이 어노테이션을 사용하면 web.xml 파일에 서블릿 매핑을 추가할 필요 없이 서블릿을 선언하고 매핑할 수 있습니다.

 

'@MultipartConfig' 어노테이션은 서블릿에서 멀티파트 요청을 처리하는 데 사용되는 어노테이션입니다. 멀티파트 요청은 파일 업로드와 같이 여러 종류의 데이터를 동시에 전송하는 경우에 사용됩니다. 이 어노테이션은 서블릿이 멀티 파트 요청을 처리할 수 있도록 설정합니다.

 

@WebServlet("/updateTest")
@MultipartConfig
반응형

 

EC2 서버의 루트 경로로 접근해서 uploads 폴더에 파일을 업로드하려고 합니다.  최상위 루트 디렉터리 안에 있는 uploads 폴더 경로를 uploadPath에 명시하고 업로드할 디렉터리가 존재하지 않으면 생성합니다. 

 

String uploadPath = "/uploads";

File uploadDir = new File(uploadPath);

if (!uploadDir.exists()) {
    uploadDir.mkdirs();
}

 

반복문을 사용해서 모든 업로드된 파일의 리스트를 part 객체로 받아옵니다. extractFileName 메서드를 사용해서 파일 명 정보를 조회하여 지정한 경로에 저장합니다. 

 

try {
    List<Part> parts = (List<Part>) request.getParts();
    for (Part part : parts) {
        String fileName = extractFileName(part);
        part.write(uploadPath + File.separator + fileName);
    }
    response.getWriter().println("SUCCESS");
} catch (Exception e) {
    response.getWriter().println("FAIL");
    e.printStackTrace();
}
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.List;

@WebServlet("/updateTest")
@MultipartConfig
public class testController extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String uploadPath = "/uploads"; // 업로드할 디렉토리 지정. 루트 경로 하위에 "uploads" 폴더로 지정

        File uploadDir = new File(uploadPath); 

        if (!uploadDir.exists()) { // 업로드할 디렉토리가 존재하지 않을 경우, 폴더 생성
            uploadDir.mkdirs();
        }
        try {
            List<Part> parts = (List<Part>) request.getParts(); // 모든 업로된 파일 리스트
            for (Part part : parts) {
                String fileName = extractFileName(part);
                part.write(uploadPath + File.separator + fileName); //파일을 지정한 경로로 저장
            }
         } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private String extractFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        String[] items = contentDisp.split(";");
        
        // 업로드된 파일의 이름을 추출
        for (String item : items) {
            if (item.trim().startsWith("filename")) {
                return item.substring(item.indexOf("=") + 2, item.length() - 1);
            }
        }
        return "";
    }
}

 

2. 루트 경로에서 uploads 폴더 생성 및 권한 부여 

sudo mkdir uploads
sudo chown 755 uploads

 

3. 외부에서 접근할 수 있는 톰캣 server.xml 파일 수정

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="/uploads/" docBase="upload_file_nm" reloadable="true" /> 
</Host>

 

728x90
728x90