[Dining-together] 이미지 등록 수정&& RestDocumentationRequestBuilders 이미지 test

Jifrozen·2021년 6월 30일
1

Dining-together

목록 보기
11/25

이미지 등록 수정&& RestDocumentationRequestBuilders 이미지 test

이미지 등록

1. 한개 사진 등록 수정

컨트롤러

@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();

	}

RestDocumentationRequestBuilders 이미지 test

  1. multipart를 request해줘야한다.

  2. 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-파일이미지-업로드-구현하기
이미지 처리 로직

0개의 댓글