컨트롤러
@ApiOperation(value = "회원 이미지 등록")
@ApiImplicitParams({
@ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header")
})
@PostMapping(value = "/image")
@Transactional
public CommonResult saveFile(
@RequestBody @ApiParam(value = "회원사진", required = true) MultipartFile file) throws
Throwable {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String email = authentication.getName();
User user = (User)userRepository.findByEmail(email).orElseThrow(UserNotFoundException::new);
//기존에 이미지 있으면 삭제 -> 수정을 위해
if (user.getPath() != null) {
new File(user.getPath()).delete();
}
//파일 네임 설정(사용자pk_photo)
String fileName = user.getId() + "_photo";
String filePath = fileService.save(file, fileName, "user");
//파일이 none 이면 파일이 없는 오류 띄움
if (filePath == "none") {
throw new FileNotFoundException();
} else {
user.imageUpdate(filePath);
}
return responseService.getSuccessResult();
}
FileService.java
public String save(MultipartFile file, String name, String type) {
StringBuilder sb = new StringBuilder();
File dest = null;
// file image 가 없을 경우
if (file.isEmpty()) {
sb.append("none");
}
if (!file.isEmpty()) {
// jpeg, png, gif 파일들만 받아서 처리할 예정
String contentType = file.getContentType();
String originalFileExtension = null;
// 확장자 명이 없으면 이 파일은 잘 못 된 것이다
if (ObjectUtils.isEmpty(contentType)) {
sb.append("none");
}
if (!ObjectUtils.isEmpty(contentType)) {
if (contentType.contains("image/jpeg")) {
originalFileExtension = ".jpg";
} else if (contentType.contains("image/png")) {
originalFileExtension = ".png";
} else if (contentType.contains("image/gif")) {
originalFileExtension = ".gif";
}
sb.append(name + originalFileExtension);
}
dest = new File(
"파일경로/upload/" + type + "/" + sb.toString());
try {
file.transferTo(dest);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// db에 파일 위치랑 번호 등록
}
return dest.getPath();
}
multipart를 request해줘야한다.
restDocs을 이용해 파일도 만들어야한다 -> RestDocumentationRequestBuilders
결론 RestDocumentationRequestBuilders에서 request로 multipart file 날려줘야함
https://docs.spring.io/spring-restdocs/docs/current/api/org/springframework/restdocs/mockmvc/RestDocumentationRequestBuilders.html
역시 해답은 공식문서!!
fileUpload를 사용하면 되는구나..>!
UserControllerTest.java
@Test
void saveFile() throws Exception {
MockMultipartFile file
= new MockMultipartFile(
"file",
"hello.jpg",
MediaType.IMAGE_JPEG_VALUE,
"Hello, World!".getBytes()
);
mockMvc.perform(
RestDocumentationRequestBuilders.fileUpload("/member/image").file(file)
.header("X-AUTH-TOKEN", token))
.andDo(print())
.andExpect(status().isOk())
.andDo(document("saveFile",
requestHeaders(
headerWithName("X-AUTH-TOKEN").description(
"토큰값")),
requestParts(
partWithName("file").description("The file to upload")
),
responseFields(
fieldWithPath("success").description("성공여부"),
fieldWithPath("code").description("코드번호"),
fieldWithPath("msg").description("메시지")
)));
}
잘된다!
https://velog.io/@pyo-sh/Spring-Boot-파일이미지-업로드-구현하기
이미지 처리 로직