파일다운로드 메소드

@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에 추가 
복사했습니다!