상세 컨텐츠

본문 제목

210624 다운로드 및 갱신~

JAVA/Spring

by 영공쁘이 2021. 8. 7. 12:18

본문

 

갱신: 댓글 더보기, 화면 갱신 오류

1) 더보기에 필요한 요소: 몇 개를 기준으로 하여 보여줄 지를 (JSON.Stringify(size:보여줄댓글수))나타내기

(성공 시, html로 댓글을 출력)

(실패 시, 연결 오류를 나타내고 " clearInterval(만든 시간 id값) "을 써서 갱신시간을 멈춘다.

화면 갱신 오류 잡기

(비동기 방식으로 화면 날림 방지 및 시간 조절로 깜빡임 방지)

 

2) 현재 사용하는 매핑 구조(요청 경로 설정)

게시물 등록(board)

게시물목록 출력(boards)

게시물상세 출력(board/no)

게시물댓글등록(board/comment)

게시물댓글들출력(board/comments/no)

화면 갱신(board/comments/board_no)

첨부파일경로(/board/attach/attach.no)

 

2-1) 매핑 시, 함수 리턴 타입에 따른 형태 변화

-1-1) String들어오면 뷰명을 찾는다.

@RequestMapping("member")

public String process(){ return "view 명"; } ;

 

-1-2) String들어오면 String을 찾는다.

@RequestMapping("member")

public String process(@ResponseBody DSize dsize)

{

html += dsize를 이용한 내용

return html; } ;

 

-1-3) void들어오면 member.jsp를(뷰를) 찾는다.

@RequestMapping("member")

public void process(){ return "view 명"; } ;

 

-1-4) 프로세스 내에서 직접 응답 처리를 하겠다(뷰로 보내는게 없다)

@RequestMapping(..)

public void process(req,res , ..) :

--> webService!

 

3) 파일 다운로드

-1) 체계

 

 

 

response의 In, output stream 구조

 

부가설명: 전송 데이터 버퍼의 크기는 input buffer나 프로필 정보의 크기만큼 바뀐다(그만큼 write(브라우저로 내보내기 때문)

 

왼쪽:

(외부 폴더에서 읽어올 경우-메모리에 데이터가 안 올려졌을 경우)

hdd file -> fileinputstream -> buffer에 올림(데이터를) read(buffer)-> outputstream (write)-> memory있는걸 data box에 넣는다.

 

outputstream기준 오른쪽

: (바로 읽어올 경우)profile -> outputstream (write)-> data를 data box에 바로 올린다

 

 

-2) 구성(코드는 그대로 가져온 것)

 

@Controller
public class Attach컨트롤 {
	@Autowired IAttachDAO attachDAO;
	
    @RequestMapping("/board/attach/{a_no}")	 //{a_no}는 pathvariable 뒤에 있는 값 껴서 변수에 있는 값 넣어라
	public void fileDown(HttpServletRequest request, HttpServletResponse response, @PathVariable("a_no") int 접수번호) {
    	//매핑시켜도 뷰같은거를 안찾는다.(데이터는 여기서 끝난 데이터를 전달해준다) - 여기서 응답하는 코드가 직접적으로 했을것이다~!
    
    	try { //브라우저때문에 넣었다. 오류날 수 있어서~
		 Attach attach=attachDAO.findByNo(접수번호); //attach 객체를 찾아내라!
	     String filename = attach.getName();
	     String encodedFilename="";	
	     String path = request.getSession().getServletContext().getRealPath("/upload/board");
	     String fullFilePath=path+"//"+attach.getBoard().getNo()+"//"+attach.getName(); //게시물 번호가 필요해서 attach를 가져옴
	    System.out.println(fullFilePath);
	     String browser = request.getHeader("User-Agent"); //브라우저의 경로가 나옴
	     System.out.println(browser);
	     if (browser.contains("MSIE")||browser.contains("Chrome")) {
	     encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
	     } else if (browser.contains("Firefox")) {
	     encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
	     } else if (browser.contains("Opera")) {
	     encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
	     }
    	//폴더에 있는 파일을 찾아내야 한다 그래서 파일 명칭 알아야 해 그래서!! db에서 찾아와야 겠구나!![게시물 번호와 파일 명을 가져와야지!]
 
    	
    	response.setContentType("application/octer-stream: charset=utf-8"); //바이너리 파일 읽기
    	response.setHeader("Content-Transfer-Encoding", "binary"); //바이너리 형식으로 읽어옴
    	response.setHeader("Content-Disposition", "attachment; filename=\""+encodedFilename+"\"");  // encodedFilename 부분에! mydata.dat 형식으로 가져오고싶은데~~ 흠~ img jpeg~를 예쁘게 한거다 그냥ㅋ
    	
    	//(정보를 추가로 준다. 근데 다운로드여서 파일 이름을 설정해야 함!)
    	//다운로드 되고 로컬에 저장할 것인지, 웹브라우저로 나타낼 것인지를 정하는 곳(여기서는 다운로드다(attachment)
    	File file = new File(fullFilePath);
    	response.setHeader("Content-Length", ""+file.length()); //파일의크기 만큼 보낼 데이터의 버퍼의 크기가 변한다.
    	
    	//각각의 스트림을 준비하는 곳
    	OutputStream os = response.getOutputStream();
    	FileInputStream fis = new FileInputStream(file);
    	int 읽은크기 = 0;
    	byte [] 버퍼 = new byte[1024]; //먼저 크기를 정하고 밑에서 읽은 만큼 내보내라는 코드다.
    	while((읽은크기 = fis.read(버퍼))!=-1) { //fis가 HDD파일을 읽어 메모리 버퍼로 데이터 이동
    		os.write(버퍼,0,읽은크기); // os가 메모리 버퍼에서 응답 버퍼(data box)로 데이터 이동(0부터 크기만큼 보내라!)
    	}
    	//각각의 스트림을 종료하는 곳
    	fis.close();
    	os.close();}
    	catch(Exception ex) {ex.printStackTrace();}

 

-2-1)구성 2(해석)

핵심
String fullFilePath=path+"//"+attach.getBoard().getNo()+"//"+attach.getName(); 
//게시물 번호가 필요해서 attach를 가져옴
attach.getBoard().getNo() 
//이는 세팅한 게시물의 번호를 가져오는 역할을 하고
attach.getName()
//이것은 첨부 파일의 이름을 나타냄

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Disposition

 

Content-Disposition - HTTP | MDN

multipart/form-data 본문에서의 Content-Disposition 일반 헤더는 multipart의 하위파트에서 활용될 수 있는데, 이 때 이 헤더는 multipart 본문 내의 필드에 대한 정보를 제공합니다. multipart의 하위파트는 Conte

developer.mozilla.org

이 링크를 따라가면 해당 content마다의 속성에 대한 특징을 알 수 있다.

'JAVA > Spring' 카테고리의 다른 글

웹소켓 기반으로 하는 채팅2  (0) 2021.08.07
웹 소켓 기반 채팅 만들기 1  (0) 2021.08.07
@RestController  (0) 2021.08.07
파일 첨부하기 및 보기(게시판이용)  (0) 2021.08.07
Spring Boot File Upload  (0) 2021.08.07

관련글 더보기