Multipart

Dev.Hammy·2024년 4월 3일
0

반응형 스택에서 이에 상응하는 내용 보기

MultipartResolver활성화되면 multipart/form-data가 포함된 POST 요청의 콘텐츠가 구문 분석되어 일반 요청 매개변수로 액세스됩니다. 다음 예에서는 하나의 일반 양식 필드와 하나의 업로드된 파일에 액세스합니다.

@Controller
public class FileUploadController {

	@PostMapping("/form")
	public String handleFormUpload(@RequestParam("name") String name,
			@RequestParam("file") MultipartFile file) {

		if (!file.isEmpty()) {
			byte[] bytes = file.getBytes();
			// store the bytes somewhere
			return "redirect:uploadSuccess";
		}
		return "redirect:uploadFailure";
	}
}

인수 유형을 List<MultipartFile>로 선언하면 동일한 매개변수 이름에 대해 여러 파일을 확인할 수 있습니다.

@RequestParam annotation이 annotation에 지정된 매개변수 이름 없이 Map<String, MultipartFile> 또는 MultiValueMap<String, MultipartFile>으로 선언되면 지정된 각 매개변수 이름에 대한 멀티파트 파일로 맵이 채워집니다.

[Note]
Servlet 멀티파트 구문 분석을 사용하면 Spring의 MultipartFile 대신 jakarta.servlet.http.Part를 메소드 인수 또는 컬렉션 값 type으로 선언할 수도 있습니다.

command 객체에 대한 데이터 바인딩의 일부로 멀티파트 콘텐츠를 사용할 수도 있습니다. 예를 들어, 이전 예제의 양식 필드와 파일은 다음 예제와 같이 form 객체의 필드일 수 있습니다.

class MyForm {

	private String name;

	private MultipartFile file;

	// ...
}

@Controller
public class FileUploadController {

	@PostMapping("/form")
	public String handleFormUpload(MyForm form, BindingResult errors) {
		if (!form.getFile().isEmpty()) {
			byte[] bytes = form.getFile().getBytes();
			// store the bytes somewhere
			return "redirect:uploadSuccess";
		}
		return "redirect:uploadFailure";
	}
}

RESTful 서비스 시나리오에서는 브라우저가 아닌 클라이언트에서도 멀티파트 요청을 제출할 수 있습니다. 다음 예에서는 JSON이 포함된 파일을 보여줍니다.

POST /someUrl
Content-Type: multipart/mixed

--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit

{
	"name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...

@RequestParamString로 사용하여 "메타 데이터" 부분에 액세스할 수 있지만 아마도 JSON에서 역직렬화하고 싶을 것입니다(@RequestBody와 유사). HttpMessageConverter로 변환한 후 멀티파트에 액세스하려면 @RequestPart annotation을 사용하세요.

@PostMapping("/")
public String handle(@RequestPart("meta-data") MetaData metadata,
		@RequestPart("file-data") MultipartFile file) {
	// ...
}

jakarta.validation.Valid와 함께 @RequestPart를 사용하거나 Spring의 @Validated annotation을 사용할 수 있으며 두 가지 모두 표준 Bean 유효성 검사가 적용됩니다. 기본적으로 유효성 검사 오류로 인해 MethodArgumentNotValidException이 발생하고 이는 400(BAD_REQUEST) 응답으로 전환됩니다. 또는 다음 예제와 같이 Errors 또는 BindingResult 인수를 통해 컨트롤러 내에서 로컬로 유효성 검사 오류를 처리할 수 있습니다.

@PostMapping("/")
public String handle(@Valid @RequestPart("meta-data") MetaData metadata, Errors errors) {
	// ...
}

다른 매개변수에 @Constraint annotation이 있어서 메서드 유효성 검사가 적용되는 경우 대신 HandlerMethodValidationException이 발생합니다. 자세한 내용은 유효성 검사 섹션을 참조하세요.

0개의 댓글