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 |
댓글