ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Spring ] 6. 파일 업로드 / 다운로드
    스타터스 백엔드 3기 2023. 1. 18. 13:02

     

    스프링을 사용하지 않고 마이바티스만 사용했을 경우

     

     

    스프링과 마이바티스를 연동한 경우

    spring-mybatis에서 하는 것

    • 스프링 데이터소스 설정하기
    • sqlsessionfactory 설정하기 (sql-mapping, mybatis-config(alias))
    • sqlsession 생성하기
    • @Annotation을 사용하기 위한 component base-package 설정

     

    여기서 생성한 세션이 @autowired를 통해 연결된다.

     

     

     

     

     

     

    main()이 아니라 서버에서 실행하는 경우 

    초록색이 추가된 부분이다.

    xml만 5개 ...

    스프링 부트 가면 xml 사라진다.

     

     

     


     

     

    파일 업로드 / 다운로드

    나중에 websocket도 배운다

     

    으 싫어 ... 

     

    application/x-www-form-urlencoded

    • html form 데이터 전송하는 방법이다.
    • 한 개의 String 형태로 전송된다.
    • 전송데이터는 name=김뫄뫄&age=12 이런 식으로 전송된다.
    • 파일을 선택해서 서버로 보낼 때도 위와 같이 보내지기에, 파일명만 보내지게 된다.
    • 파일을 보낼 땐 <form enctype="multipart/form-data" method="post">로 보내자!
    • <input type="file"> => 파일 선택창(windows) => 파일명 선택 => 파일명+길이+파일내용 보내진다.
    • 여기까지 클라이언트가 할 일!

     

    • 서버가 할 일
    • <form action="fileupload" enctype="multipart/form-data" method="post">
    • /fileupload를 받는 컨트롤러의 메소드는 Multipart 매개변수를 받아야 한다. 
    • 클라이언트가 올린 파일명과 같은 것을 찾아서 요소들을 하나의 파일로 만든다.
    • pom.xml에 파일업로드라이브러리를 설정한다.

     


     

    파일업로드 실습

    1. pom.xml에 maven dependency 추가 

    • commons-io, commons-fileupload

     

     

     

    2. servlet-context.xml에 설정 추가

     

     


     

     

    환경설정 끝

    코딩 시작(upload)

    1. 폼으로 보내는 컨트롤러

     

     

     

    2. uploadform.jsp (폼 입력)

    • enctype="multipart/form-data"
    • method="post"

     

     

     

    3. 폼에서 입력시 나오는 정보

    • Content-Type : multipart/form-data;

     

     

     

     

    4. 파일을 받는 dto는 데이터타입이 MultipartFile여야 한다.

     

     

     

    4. 업로드된 파일의 이름에 랜덤 문자열을 붙이고 지정된 경로에 저장하기

    • 폼에서 버튼을 누르면 이 컨트롤러 메소드로 이동한다.
    • 전달할 UploadDto 객체를 @ModelAttribute("dto")에 담는다.
    • 저장하고 싶은 폴더는 c:\upload 폴더이다.
    • 먼저 저장 경로를 저장한다 (savepath).
    • getFile로 받은 것을 MultipartFile 객체에 저장한다.
    • getOriginalFilename() 를 사용해서 파일명1을 추출한다.
    • 여기서 주의해야 할 점이 있다. 만약 파일1.png을 두 번 업로드한다면, upload 폴더의 파일1.png은 두 번 생성되는 게 아닌 덮어써질 것이다. 따라서 파일명에 랜덤 문자열을 추가할 것이다.
    • UUID.randomUUID()를 사용하자.
    • . 전까지 자르고, . 이후를 자른다. 이름과 확장자로 잘린다.
    • 두 개 사이에 UUID.randomUUID()를 추가한다.
    • 저장경로에 만든 이름으로 새로운 File을 저장한다. c:/upload/filename1가 된다.
    • getFile() 한 것을 transferTo()를 사용해 serverfile1로 변경한다.

     

     

     

     

     

    5. 업로드된 파일 이름 꺼내기

    • dto.file1.originalFilename을 사용한다.
    • 그냥 dto.file1만 적으면 객체값이 나온다.

     

     


     

     

     


     

     

    파일 다운로드

    1. 컨트롤러 메소드 : upload 폴더에 저장된 파일의 배열을 만들어서 반환한다.

    • /filelist를 매핑한다.
    • c:/upload에 새로운 File 객체를 생성한다.
    • f.list()를 filelist라는 스트링 배열에 담는다.
    • 모델에 담아서 보낸다.

     

     

     

     

    2. 다운로드폼.jsp를 만든다.

    • filelist를 String[]으로 받는다.
    • for문을 사용하여 filedownload?onefile=filename 으로 만든다.
    • href를 클릭하면 filedownload가 매핑된 서블릿으로 이동한다.

     

     

     

     

    3. 컨트롤러 메소드 : 다운로드 메서드를 만든다. 

    • c:/upload/filename의 위치와 이름을 가진 File 객체를 생성한다.
    • 위 객체의 length() 를 생성한다. int로 형변환 해야 하며, response에 사용된다.
    • response에 setContentType(), setContentLength(), setHeader()를 설정한다. 
    • OutputStream, FileInputStream를 사용해 FileCopyUtils.copy() 한다... ?
    • 글고 stream들 닫아준다.

     

     

     


     

     

     

    void transferTo(File dest) throws IOException, IllegalStateException;

    • 받은 파일을 지정된 대상 파일로 전송합니다.
    • 이것은 파일 시스템의 파일을 이동하거나, 파일 시스템의 파일을 복사하거나, 메모리 보유 콘텐츠를 대상 파일에 저장할 수 있다. 대상 파일이 이미 있으면 먼저 삭제됩니다.
    • 대상 파일이 파일 시스템에서 이동된 경우 이 작업을 나중에 다시 호출할 수 없습니다. 따라서 저장 메커니즘으로 작업하려면 이 메서드를 한 번만 호출하십시오.
    • 기본 제공자에 따라 임시 스토리지는 컨테이너에 따라 달라질 수 있으며 여기에 지정된 상대적 대상의 기본 디렉토리(예: Servlet 3.0 멀티파트 처리)를 포함합니다.
    • 절대 대상의 경우 임시 복사본이 이미 존재하더라도 대상 파일의 이름을 임시 위치에서 변경하거나 새로 복사할 수 있습니다.
    • @param 대상 파일(일반적으로 절대)
    • @throws 읽기 또는 쓰기 오류의 경우 IO 예외를 발생시킵니다
    • @throws 파일이 이미 파일 시스템에서 이동되어 다른 전송에 더 이상 사용할 수 없는 경우 IgalidStateException을 반환합니다
    • @see org.cla.cla 참조.파일 업로드.FileItem#write
    • @see javax.servlet.dll을 참조하십시오.부품 #쓰기(문자열)

     

     

     

Designed by Tistory.