1. 이미지 파일 불러오기
1) 첫번째 방법
* ajaxController
package com.coding404.myweb.controller;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.coding404.myweb.product.service.ProductService;
@RestController
public class AjaxController {
//업로드 경로
@Value("${project.uploadpath}")
private String uploadpath;
//이미지 정보를 처리
//1. ?키=값 쿼리스트링(requestparam)
//2. Pathvariable(가변 url 주소 넣어줌)
@GetMapping(value = "/display/{filepath}/{uuid}/{filename}", produces="image/png")
public byte[] display(@PathVariable("filepath") String filepath,
@PathVariable("uuid") String uuid,
@PathVariable("filename") String filename) {
//업로드 패스가 들어가야 함(파일이 저장된 경로)
String savename = uploadpath + "\\" + filepath + "\\" + uuid + "_" + filename;
File file = new File(savename);
//저장된 이미지 파일의 이진 데이터 형식을 구함
byte[] result= null;
try {
result = FileCopyUtils.copyToByteArray(file);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
2) 심화: 응답 본문에 대한 내용 작성하기
* ajaxController - responseEntity - 응답 본문을 직접 작성
//responseEntity - 응답 본문을 직접 작성
@GetMapping("/display/{filepath}/{uuid}/{filename}")
public ResponseEntity<byte[]> display(@PathVariable("filepath") String filepath,
@PathVariable("uuid") String uuid,
@PathVariable("filename") String filename) {
//업로드 패스가 들어가야 함(파일이 저장된 경로)
String savename = uploadpath + "\\" + filepath + "\\" + uuid + "_" + filename;
File file = new File(savename);
//저장된 이미지 파일의 이진 데이터 형식을 구함
byte[] result= null; //1. data
ResponseEntity<byte[]> entity = null;
try {
result = FileCopyUtils.copyToByteArray(file);
//2. header(뚜껑)
HttpHeaders header = new HttpHeaders();
header.add("Content-type", Files.probeContentType(file.toPath())); //파일의 컨텐츠 타입을 직접 구해서 header에 저장
//3. 상태값
entity = new ResponseEntity<>(result, header, HttpStatus.OK); //데이터, 헤더, 상태값
} catch (IOException e) {
e.printStackTrace();
}
return entity;
}
3) ProductList에서 이미지 수정을 눌렀을 때 데이터 베이스에서 저장된 이미지를 가지고 나와야 함
- 누르면 해당 이미지를 가지고 오겠다는 뜻
- modalOn 클래스가 들어가면 모달창 오픈, modalOn()으로 켤 수 있다.
- 3번째 사진처럼 modal.js의 순서를 확인하고 써주면 모달창 사용 가능함. ($(document).ready 써주기!)
- 4~7번 방법 중 택 1해서 사용 가능
* productList 맨 마지막에 script 부분, AjaxController 추가
- productList
<!-- 1. modalOn 클래스가 들어가면 모달창 오픈, 2. modalOn()으로 켤 수 있다. -->
<!-- 모달창 제어-->
<script>
//이미지 수정 버튼을 클릭 했을 때 modalOn();
$(".modalOn").click(function(e){
e.preventDefault(); //a링크의 고유 이벤트 중지
//1. ajax - 이미지 데이터 조회(prod_id 기준으로 조회) <클릭한 대상의 prod_id 값>
var prod_id = $(e.target).closest("td").next().html();
console.log(prod_id)
//2. post 방식으로 img 데이터 조회
$.ajax({
url: "../getProductImg",
type: "post",
data: JSON.stringify({prod_id: prod_id}), //데이터
contentType: "application/json", //보내는 데이터 타입
success: function(result) {
console.log(result); //반환된 데이터
},
error : function(err) {
alert("이미지 조회에 실패했습니다.");
}
});
//modalOn();
});
</script>
- ajaxController
package com.coding404.myweb.controller;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.coding404.myweb.command.ProductUploadVO;
import com.coding404.myweb.command.ProductVO;
import com.coding404.myweb.product.service.ProductService;
@RestController
public class AjaxController {
//업로드경로
@Value("${project.uploadpath}")
private String uploadpath;
@Autowired
private ProductService productService;
//이미지정보를 처리
//1. ?키=값
//2. @Pathvariable
//화면에는 2진 데이터 타입이 반환됩니다.
// @GetMapping("/display/{filepath}/{uuid}/{filename}")
// public byte[] display(@PathVariable("filepath") String filepath,
// @PathVariable("uuid") String uuid,
// @PathVariable("filename") String filename) {
//
// //파일이 저장된 경로
// String savename = uploadpath + "\\" + filepath + "\\" + uuid + "_" + filename;
//
// File file = new File(savename);
// //저장된 이미지파일의 이진데이터 형식음 구함
// byte[] result = null;
// try {
// result = FileCopyUtils.copyToByteArray(file);
// } catch (IOException e) {
// e.printStackTrace();
// }
// return result;
// }
//ResponseEntity - 응답본문을 직접 작성
@GetMapping("/display/{filepath}/{uuid}/{filename}")
public ResponseEntity<byte[]> display(@PathVariable("filepath") String filepath,
@PathVariable("uuid") String uuid,
@PathVariable("filename") String filename) {
//파일이 저장된 경로
String savename = uploadpath + "\\" + filepath + "\\" + uuid + "_" + filename;
File file = new File(savename);
//저장된 이미지파일의 이진데이터 형식음 구함
byte[] result = null; //1. data
ResponseEntity<byte[]> entity = null;
try {
result = FileCopyUtils.copyToByteArray(file);
//2. header
HttpHeaders header = new HttpHeaders();
header.add("Content-type", Files.probeContentType(file.toPath())); //파일의 컨텐츠타입을 직접 구해서 header에 저장
//3. 응답본문
entity = new ResponseEntity<>(result, header, HttpStatus.OK); //데이터, 헤더, 상태값
} catch (IOException e) {
e.printStackTrace();
}
return entity;
}
//prod_id값을 받아서 이미지정보를 반환 (함수의 모형을 선언)
@PostMapping("/getProductImg")
public ResponseEntity<List<ProductUploadVO>> getProductImg(@RequestBody ProductVO vo) { //vo, map
return new ResponseEntity<>(productService.getProductImg(vo), HttpStatus.OK);
}
}
- service, mapper.java에 이미지 데이터 조회 넣어줄 것
- impl 오버라이딩
- mapper.xml
<!-- 이미지 데이터 조회 -->
<select id ="getProductImg" resultType="ProductUploadVO">
select * from PRODUCT_UPLOAD where prod_id = #{prod.id}
</select>
- ProductList
<!-- 1. modalOn클래스 들어가면 모달창오픈, 2. modalOn() 으로 켤수 있음 -->
<!-- 모달창 제어 -->
<script>
//이미지 수정버튼을 클릭했을 때 modalOn();
$(".modalOn").click(function(e) {
e.preventDefault(); //a링크의 고유이벤트 중지
//1. 클릭한 대상의 prod_id값
var prod_id = $(e.target).closest("td").next().html();
//2. post방식으로 img데이터 조회
$.ajax({
url : "../getProductImg",
type: "post",
data: JSON.stringify({prod_id: prod_id}), //데이터
contentType: "application/json", //보내는데이터타입
success: function(result) {
console.log(result); //반환된데이터
var str = "";
var arr = ['a', 'b', 'c'];
for(var i = 0; i < result.length; i++) {
str += '<div class="left">';
str += '<span>추가이미지</span>';
str += '<label class="upload-display" for="'+ arr[i] +'_file">';
str += '<span class="upload-thumb-wrap">';
str += '<img class="upload-thumb" src="'+ '../display/' + result[i].filepath + '/' + result[i].uuid + '/' + result[i].filename +'">';
str += '</span>';
str += '</label>';
str += '<input class="upload-name" value="파일선택" disabled="disabled">';
str += '<input type="file" name="file" id="'+ arr[i] +'_file" class="upload-hidden">';
str += '<input type="hidden" value="">';
str += '<input type="hidden" value="">';
str += '<button type="button" class="normal_btn" style="display: block;">삭제</button>';
str += '</div>';
}
$(".filebox").html(str);
},
error : function(err) {
alert("이미지 조회에 실패했습니다");
}
});
//modalOn();
});
</script>
2. 파일 다운로드
* ajaxController
- url에 주소 하면 사진 파일 다운로드 됨. 버튼이랑 연결만 해주면 끝!
@GetMapping("/download/{filepath}/{uuid}/{filename}")
public ResponseEntity<byte[]> download(@PathVariable("filepath") String filepath,
@PathVariable("uuid") String uuid,
@PathVariable("filename") String filename) {
//파일이 저장된 경로
String savename = uploadpath + "\\" + filepath + "\\" + uuid + "_" + filename;
File file = new File(savename);
//저장된 이미지파일의 이진데이터 형식음 구함
byte[] result = null; //1. data
ResponseEntity<byte[]> entity = null;
try {
result = FileCopyUtils.copyToByteArray(file);
//2. header
HttpHeaders header = new HttpHeaders();
//다운로드임을 명시
header.add("Content-Disposition", "attachment; filename=" + filename );
//3. 응답본문
entity = new ResponseEntity<>(result, header, HttpStatus.OK); //데이터, 헤더, 상태값
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("이미지 호출 실행됨");
return entity;
}
3. 세션과 인터셉터
- bootBasic에서 실행
* UserVO, UserController, login, mypage.html
- UserVO
package com.simple.basic.command;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UsersVO<T> {
private String id;
private String pw;
private String name;
private String email;
//1: N 조인에서는 N쪽을 list로 처리
private List<T> memoList;
}
- UserController
package com.simple.basic.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.simple.basic.command.UsersVO;
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login() {
return "user/login";
}
//로그인 기능
@PostMapping("/login")
public String loginForm(UsersVO vo, HttpSession session) {
//select * from 유저 where id = ? and pw = ?
//서비스 영역 호출(로그인 성공)
UsersVO userVO = new UsersVO();
userVO.setId("aaa");
userVO.setPw("홍길동");
//로그인 성공 = 세션을 이용해서 인증값
if( userVO != null) {
session.setAttribute("user_id", userVO.getId()); //토큰
return "redirect:/user/mypage"; //로그인 성공
}
return "user/login"; //로그인 실패
}
//특정 유저들만 접근할 수 있는 페이지
@GetMapping("/mypage")
public String mypage(/*HttpSession session*/) {
//세션 검사
/*
if(session.getAttribute("user_id") == null) {
return "redirect:/user/login";
}
*/
return "user/mypage";
}
//특정 유저들만 접근할 수 있는 페이지
@GetMapping("/info")
public String info() {
return "user/info";
}
}
- login
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="post">
<input type="text" name="id">
<input type="password" name="pw">
<input type="submit" value="로그인">
</form>
</body>
</html>
- mypage
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>세션 값이 있다면 session.이름으로 사용 가능 합니다.</h3>
[[${session.user_id}]]
</body>
</html>
'TIL > Spring boot' 카테고리의 다른 글
windows에서 java 환경변수 설정하기 (0) | 2023.06.12 |
---|---|
day92-spring boot (0) | 2023.02.23 |
day90-spring boot (0) | 2023.02.21 |
day88-spring boot (0) | 2023.02.17 |
day86-spring boot (0) | 2023.02.16 |