본문 바로가기
수업내용

20230628 수업내용 Up/DouwnloadFile🤣🤣🤣

by titlejjk 2023. 6. 28.

FileServiceImpl Class에 있는 File을 저장해주는 메서드

파일명과, 파일 사이즈를 저장해주며 

dto에 업로드된 파일의 정보를 담아준다.

@Override
	public void saveFile(FileDto dto, ModelAndView mView, HttpServletRequest request) {
	      //업로드된 파일의 정보를 가지고 있는 MultipartFile 객체의 참조값 얻어오기 
	      MultipartFile myFile=dto.getMyFile();
	      //원본 파일명
	      String orgFileName=myFile.getOriginalFilename();
	      //파일의 크기
	      long fileSize=myFile.getSize();
	      
	      // webapp/resources/upload 폴더 까지의 실제 경로(서버의 파일시스템 상에서의 경로)
	      String realPath=request.getServletContext().getRealPath("/resources/upload");
	      //저장할 파일의 상세 경로
	      String filePath=realPath+File.separator;
	      //디렉토리를 만들 파일 객체 생성
	      File upload=new File(filePath);
	      if(!upload.exists()) {//만일 디렉토리가 존재하지 않으면 
	         upload.mkdir(); //만들어 준다.
	      }
	      //저장할 파일 명을 구성한다.
	      String saveFileName=
	            System.currentTimeMillis()+orgFileName;
	      try {
	         //upload 폴더에 파일을 저장한다.
	         myFile.transferTo(new File(filePath+saveFileName));
	         System.out.println(filePath+saveFileName);
	      }catch(Exception e) {
	         e.printStackTrace();
	      }
	      //dto 에 업로드된 파일의 정보를 담는다.
	      String id=(String)request.getSession().getAttribute("id");
	      dto.setWriter(id); //세션에서 읽어낸 파일 업로더의 아이디 
	      dto.setOrgFileName(orgFileName);
	      dto.setSaveFileName(saveFileName);
	      dto.setFileSize(fileSize);
	      //fileDao 를 이용해서 DB 에 저장하기
	      dao.insert(dto);
	      //view 페이지에서 사용할 모델 담기 
	      mView.addObject("dto", dto);
	}

다음은 Download 기능으로 FileController에서있는 download메서드를 살펴보자면

@RequestMapping("/file/download")
	   public ModelAndView download(int num, ModelAndView mView) {
	      //num은 다운로드 해줄 파일의 번호(pk)
		   service.getFileData(num, mView);
	      // 응답을 할 bean 의 이름을 설정 
	      mView.setViewName("fileDownView");
	      return mView;
	   }

FileSeviceImpl 에 있는 getFileData

@Override
	public void getFileData(int num, ModelAndView mView) {
		//다운로드할 파일의 정보를 얻어와서
		FileDto dto = dao.getData(num);
		//ModelAndView 객체에 담아준다.
		mView.addObject("dto",dto);
	}

응답을 할 때 bean이름으로 등록해주기

package com.gura.spring04.file.view;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.AbstractView;
/*
 *	[ View 를 만들어서 동작 시키는 방법 ]
 *	
 *	- AbstractView 추상클래스를 상속받아서 클래스를 정의한다.
 *	- @Component("bean 의 이름 지정") 어노테이션을 붙여서 이름이 있는 bean이 되게 한다.
 *	- servlet-context.xml에 BeanNameViewResolver 설정을 추가한ㄷ나,
 */

//component scan을 통해서 bean이 될수 있도록
@Component("fileDownView")
public class FileDownView extends AbstractView{

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		/*
		 *	ModelAndView 객체에 addObjec()해서 담은 내용은
		 * Map객체에서 작업해서 엊어낼 수 있다.
		 */
		FileDto dto=(FileDto)model.get("dto");

	      //파일을 다운로드 하는 작업을 해준다.
	      long fileSize=dto.getFileSize();
	      String orgFileName=dto.getOrgFileName();
	      String saveFileName=dto.getSaveFileName();
	      
	      //다운로드 시켜줄 파일의 실제 경로 구성하기 
	      // File.separator 는 window 에서는 \ , linux 에서는 /  를 얻어오게 된다. 
	      String path=request.getServletContext().getRealPath("/resources/upload")+
	                  File.separator+saveFileName;
	      //다운로드할 파일에서 읽어들일 스트림 객체 생성하기
	      FileInputStream fis=new FileInputStream(path);
	      //다운로드 시켜주는 작업을 한다. (실제 파일 데이터와 원본파일명을 보내줘야한다.)
	      
	      //한글 파일명 세부처리 
	      String encodedName=URLEncoder.encode(orgFileName, "utf-8");
	      //파일명에 공백이있는 경우 처리 
	      encodedName=encodedName.replaceAll("\\+"," ");
	      
	      
	      //응답 헤더 정보 설정
	      response.setHeader("Content-Disposition","attachment;filename="+encodedName);
	      response.setHeader("Content-Transfer-Encoding", "binary");
	      
	      //다운로드할 파일의 크기 읽어와서 다운로드할 파일의 크기 설정
	      response.setContentLengthLong(fileSize);
	      
	      //클라이언트에게 출력할수 있는 스트림 객체 얻어오기
	      // response.getOutputStream() 메소드는 클라이언트에게 출력할수 있는 OutputStream 객체를 반환한다.
	      BufferedOutputStream bos=
	         new BufferedOutputStream(response.getOutputStream());
	      //한번에 최대 1M byte 씩 읽어올수 있는 버퍼
	      byte[] buffer=new byte[1024*1024];
	      int readedByte=0;
	      //반복문 돌면서 출력해주기
	      while(true){
	         //byte[] 객체를 이용해서 파일에서 byte 알갱이 읽어오기
	         readedByte = fis.read(buffer);
	         if(readedByte == -1)break; //더이상 읽을 데이터가 없다면 반복문 빠져 나오기
	         //읽은 만큼 출력하기
	         bos.write(buffer, 0, readedByte);
	         bos.flush(); //출력
	      }
	      //FileInputStream 닫아주기 
	      fis.close();   
	}

}

 

'수업내용' 카테고리의 다른 글

20230703 jQeury  (0) 2023.07.03
20230629 jQeury  (0) 2023.06.29
20230628 수업내용🫡🫡🫡  (0) 2023.06.28
20230627 수업내용🤣🤣🤣  (0) 2023.06.27
20230626 수업내용🤦‍♂️🤦‍♂️🤦‍♂️  (0) 2023.06.26

댓글