멀티파트 파일 및 json 데이터를 스프링 부트로 전송하는 방법
클라이언트 측(포스트맨 또는 자바 클라이언트)에서 json 본문 요청 매개변수와 멀티파트 파일을 수락하는 POST 요청 API 호출이 있습니다.
저는 json 데이터와 multipart 파일을 한 번의 요청으로 전달하고 싶습니다.
코드는 아래와 같이 작성하였습니다.
@RequestMapping(value = "/sendData", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity<MailResponse> sendMail(@RequestPart MailRequestWrapper request) throws IOException
하지만 저는 우체부 휴식 고객을 이용해서 그것을 할 수 없었습니다.
저는 서버 쪽에서 스프링 부트를 사용하고 있습니다.
누가 이 문제에 대해 제게 제안해 주시겠습니까?
잘 부탁드립니다.
JSON 개체에 @RequestParam 및 Converter를 사용할 수 있습니다.
간단한 예:
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
@Data
public static class User {
private String name;
private String lastName;
}
@Component
public static class StringToUserConverter implements Converter<String, User> {
@Autowired
private ObjectMapper objectMapper;
@Override
@SneakyThrows
public User convert(String source) {
return objectMapper.readValue(source, User.class);
}
}
@RestController
public static class MyController {
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("user") User user) {
return user + "\n" + file.getOriginalFilename() + "\n" + file.getSize();
}
}
}
그리고 우체부:
아파치 업데이트httpclient 4.5.6
예:
pom.xml 종속성:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.6</version>
</dependency>
<!--dependency for IO utils-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
애플리케이션이 완전히 시작된 후 서비스가 실행됩니다. 변경File
파일 경로
@Service
public class ApacheHttpClientExample implements ApplicationRunner {
private final ObjectMapper mapper;
public ApacheHttpClientExample(ObjectMapper mapper) {
this.mapper = mapper;
}
@Override
public void run(ApplicationArguments args) {
try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
File file = new File("yourFilePath/src/main/resources/foo.json");
HttpPost httpPost = new HttpPost("http://localhost:8080/upload");
ExampleApplication.User user = new ExampleApplication.User();
user.setName("foo");
user.setLastName("bar");
StringBody userBody = new StringBody(mapper.writeValueAsString(user), MULTIPART_FORM_DATA);
FileBody fileBody = new FileBody(file, DEFAULT_BINARY);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.addPart("user", userBody);
entityBuilder.addPart("file", fileBody);
HttpEntity entity = entityBuilder.build();
httpPost.setEntity(entity);
HttpResponse response = client.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
// print response
System.out.println(IOUtils.toString(responseEntity.getContent(), UTF_8));
} catch (Exception e) {
e.printStackTrace();
}
}
}
콘솔 출력은 다음과 같습니다.
ExampleApplication.User(name=foo, lastName=bar)
foo.json
41
둘 다 사용할 수 있습니다.
@RequestPart : 이 주석은 다중 파트 요청의 일부를 method 인수와 연결하여 복잡한 다중 속성 데이터(예: JSON 또는 XML)를 페이로드로 보내는 데 유용합니다.
즉, Request Part는 요청에서 클래스 개체로 json 문자열 개체를 구문 분석합니다.반면에 Request Param은 json 문자열 값에서 문자열 값을 가져옵니다.
예를 들어 Request Part:
@RestController
@CrossOrigin(origins = "*", methods= {RequestMethod.POST, RequestMethod.GET,
RequestMethod.PUT})
@RequestMapping("/api/api-example")
public class ExampleController{
@PostMapping("/endpoint-example")
public ResponseEntity<Object> methodExample(
@RequestPart("test_file") MultipartFile file,
@RequestPart("test_json") ClassExample class_example) {
/* do something */
}
}
우체부는 다음과 같이 구성됩니다.
@RequestParam : 다중 부분 데이터를 보내는 또 다른 방법은 @RequestParam을 사용하는 것입니다.이 기능은 앞에서 말한 것처럼 키/값만 파일과 함께 키/값 쌍으로 전송되는 단순 데이터에 특히 유용합니다.또한 쿼리 매개 변수에서 값을 얻는 데 사용되며, 그것이 주요 목표라고 생각합니다.
저는 지난 몇 시간 동안 이 문제에 갇혀 있었습니다.
그래서 저는 이 질문을 접하게 되었습니다.
요약:.
사용하다@ModelAttribute
대신에@RequestBody
.@ModelAttriute
엔티티에 다중 부분 속성이 없는 다른 일반 엔티티 매핑과 마찬가지로 작동합니다.
두 가지 옵션이 있습니다.
json 데이터와 함께 Multipart File 전송
public void uploadFile(@RequestParam("identifier") String identifier, @RequestParam("file") MultipartFile file){
}
OR
MultipartFile 내에서 Json 데이터를 전송한 다음 아래에 언급된 MultipartFile을 구문 분석하면 됩니다.
public void uploadFile(@RequestParam("file") MultipartFile file){
POJO p = new ObjectMapper().readValue(file.getBytes(), POJO.class);
}
여기 답변 부분에서 모두 설명합니다.
언급URL : https://stackoverflow.com/questions/52818107/how-to-send-the-multipart-file-and-json-data-to-spring-boot
'programing' 카테고리의 다른 글
RequestsDependencyWarning: urllib3(1.25.2) 또는 chardet(3.0.4)이 지원되는 버전과 일치하지 않습니다!고치다 (0) | 2023.07.18 |
---|---|
구성 요소에서 Vuex Store의 변환자에 액세스하면 알 수 없는 변환 유형 오류가 발생함 (0) | 2023.07.13 |
JDBC 결과 집합 getDate 정확도 손실 (0) | 2023.07.13 |
Sundown이 블록 인용문(">"로 시작하는 줄)을 렌더링하려면 어떻게 해야 합니까? (0) | 2023.07.13 |
SQL Server 2008의 고유 키 대 고유 인덱스 (0) | 2023.07.13 |