갱신: 댓글 더보기, 화면 갱신 오류
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) 체계
부가설명: 전송 데이터 버퍼의 크기는 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마다의 속성에 대한 특징을 알 수 있다.
웹소켓 기반으로 하는 채팅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 |