programing

멀티파트 파일 및 json 데이터를 스프링 부트로 전송하는 방법

oldcodes 2023. 7. 13. 21:07
반응형

멀티파트 파일 및 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 개체에 @RequestParamConverter 사용할 수 있습니다.
간단한 예:

@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

반응형