파일다운로드 메소드
@Controller
public class fileDownloadController {
private static String CURR_IMAGE_REPO_PATH = "C:\\gallery\\file_repo";
@RequestMapping("/download")
protected void download(@RequestParam("fileName") String fileName,
@RequestParam("goods_id")String goods_id, HttpServletResponse response)throws Exception{
//byte 기반 출력 스트림 최상위 추상클래스
//모든 바이트의 기반 출력 스트림 클래스를 상속받아 재정의
OutputStream out = response.getOutputStream();
String filePath = CURR_IMAGE_REPO_PATH +"\\"+goods_id+"\\"+fileName;
File image = new File(filePath);
//setHeader? 새롭게 설정한 값으로 재설정
response.setHeader("Cache-Control", "no-cache");
//addHeader? 해당 키에 값 추가
response.addHeader("Content-disposition", "attachment; fileName=" + fileName);
//fileinputstream을 통해 file객체(image)를 읽기위해 선언
FileInputStream in = new FileInputStream(image);
//1024*8byte 크기 byte배열을 buffer에 만듬
byte[] buffer = new byte[1024*8];
while(true) {
//buffer을 읽고 buffer의 크기를 count에 넣음
int count = in.read(buffer);
//count == -1이면 반환할 값이 없는것이기에 break;를 사용해 멈춤
if(count == -1)
break;
//buffer를 인덱스번호 0~count까지 사용
out.write(buffer,0,count);
}
in.close();
out.close();
}
- Stream? Input, OutputStream 존재하며 , 단일 방향으로 연속적으로 흘러간다
- Input 은 외부에서 데이터를 읽으며 , Output은 외부로 부터 데이터를 출력
- setHeader("cache-control", "no-cache")=> cache-control는 웹 컨텐츠 캐시정책 컨트롤 의미 . no-cache는 캐시가 유효한 지 확인하기 위해 매번 서버요청
- addheader("content-disposition", "attachment: fileName =" +fileName); => 브라우저 인식 파일 확장자를 포함하여 모든 파일 확장자 들에 대해 다운로드 시 무조건 '파일 다운로드' 대화상자 뜨도록 하는 헤더 속성임.
썸네일 컨트롤러 메소드
@RequestMapping("/thumbnails.do")
protected void thumbnails(@RequestParam("fileName") String fileName,
@RequestParam("goods_id") String goods_id,
HttpServletResponse response) throws Exception {
OutputStream out = response.getOutputStream();
String filePath=CURR_IMAGE_REPO_PATH+"\\"+goods_id+"\\"+fileName;
File image=new File(filePath);
//exists() => image 겨올에 file/directory(folder)가 존재하는가? 확인
if (image.exists()) {
Thumbnails.of(image).size(121,154).outputFormat("png").toOutputStream(out);
}
byte[] buffer = new byte[1024 * 8];
out.write(buffer);
out.close();
}
- if (image.exists()) {
Thumbnails.of(image).size(121,154).outputFormat("png").toOutputStream(out);
} 을 사용하여 메인페이지에 등록된 .png파일들을 size(121.154)로 표시한다.
파일 업로드 메소드
private static final String CURR_IMAGE_REPO_PATH = "C:\\gallery\\file_repo";
protected List<ImageFileVO> upload(MultipartHttpServletRequest multipartRequest) throws Exception {
// 파일 정보를 저장할 fileList 선언
List<ImageFileVO> fileList = new ArrayList<ImageFileVO>();
//fileNames에 대한 반복자 선언 = fileName에 대한 파일 업로드 및 단일요청
Iterator<String> fileNames = multipartRequest.getFileNames();
//.hasNext() => fileNames에 대한 요소가 더 있는가 체크 하기위해.
while (fileNames.hasNext()) {
ImageFileVO imageFileVO = new ImageFileVO();
//.next() => fileNames의 다음으로 이동>>
String fileName = fileNames.next();
imageFileVO.setFileType(fileName);
MultipartFile mFile = multipartRequest.getFile(fileName);
String originalFileName = mFile.getOriginalFilename();
imageFileVO.setFileName(originalFileName);
fileList.add(imageFileVO);
File file = new File(CURR_IMAGE_REPO_PATH + "\\" + fileName);
//mFile의 값이 null인지?
if (mFile.getSize() != 0) {
// 경로상에 파일이 존재하지 않는경우
if (!file.exists()) {
// 경로에 해당하는 디렉토리 생성
if (file.getParentFile().mkdirs()) {
// 이후 파일생성
file.createNewFile();
}
}
//mFile의 파일 복사해서 전송
mFile.transferTo(new File(CURR_IMAGE_REPO_PATH + "\\" + "temp" + "\\" + originalFileName));// 임시로 정장된
// 멀티파트파일을
// 실제파일로 전송
}
}
return fileList;
}
- Iterator : 반복자 , 리스트를 순회 할 수 있게 하는 객체. // 객체지향 에서 배열, 유사한 자료구조의 내부요소 순회
- ex) ArrayList , HashMap
- while() 문에서는 fileNames에 대한 값이 더 있으면 fileNames 다음으로 이동 => imageFileVO 에 fileType에 값을 설정 => multipartRequest.getFile() 선언 . 파일업로드 및 단일 요청 => mFile의 이름을 읽어 와서 originalFileName 변수 저장 => imageFileVO의 fileName 에 originalFileName값을 셋팅 => 마지막으로 fileList에 추가
'Spring > Study' 카테고리의 다른 글
[Spring]게시판 만들기 - 등록 (0) | 2022.01.23 |
---|---|
[Spring]게시판 만들기 - 목록 & 상세보기(조회수부분까지) (0) | 2022.01.23 |
[JavaScript]다음 주소(우편번호) 검색API (0) | 2021.12.26 |
[Spring]회원 가입 & id중복체크 구현 (0) | 2021.12.26 |
[Spring]로그인 & 로그아웃 구현 (0) | 2021.12.23 |