복붙노트

[SPRING] Spring 4를 사용하여 MultipartFile 목록 업로드하기 restTemplate (Java Client & RestController)

SPRING

Spring 4를 사용하여 MultipartFile 목록 업로드하기 restTemplate (Java Client & RestController)

나는 내 RestController에 Restipemplate를 사용하여 MultipartFile의 List를 게시하려고 노력하고있다. 비록 나의 클라이언트와 컨트롤러에 사용할 정확한 문법과 타입에 대해서는 약간 혼란 스럽지만. 여기 제가 지금까지했던 연구를 기반으로 한 것은 ...

FileUploadClient.java

public void uploadFiles(List<MultipartFile> multiPartFileList) throws IOException {
    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    List<Object> files = new ArrayList<>();
    for(MultipartFile file : multiPartFileList) {
        files.add(new ByteArrayResource(file.getBytes()));
    }
    map.put("files", files);

    // headers is inherited from BaseClient
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);
    ResponseEntity<String> response = restTemplate.exchange(restURI + "/rest/fileupload/uploadfiles", HttpMethod.POST, request, String.class);
    if(HttpStatus.OK.equals(response.getStatusCode())) {
        System.out.println("status for /rest/fileupload/uploadfiles ---> " + response);
    }
}

FileUploadRestController.java

@RequestMapping(value = "/uploadfiles", method = RequestMethod.POST)
public ResponseEntity<?> uploadFiles(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) {
    ResponseEntity<?> response;
    try {
        // do stuff...
        response = new ResponseEntity<>(header, HttpStatus.OK);
        System.out.println("file uploaded");
    } catch (Exception e) {
        // handle exception
    }
    return response;
}

을 포함한다.

<filter>
    <filter-name>multipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

spring-servlet.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- max upload size in bytes -->
    <property name="maxUploadSize" value="20971520" /> <!-- 20MB -->
    <!-- max size of file in memory (in bytes) -->
    <property name="maxInMemorySize" value="1048576" /> <!-- 1MB -->
</bean>

나는 그것을 올바르게 이해한다. multipart 필터는 My MultiValueMap을 List of MultipartFiles와 MultipartHttpServletRequest로 구문 분석해야합니까? 내 클라이언트가 내 RestController에 도달 할 수있는 유일한 방법은 ByteArrayResource로 파일 데이터를 보내는 것입니다. 그러나 내 컨트롤러에서 RequestBody는 항상 null이고 MultipartHttpServletRequest에는 multipartFiles 특성에 대한 빈 맵이 있습니다. 이 문제를 해결하기 위해 수많은 게시물을 검토했지만 아무 소용이 없습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

해결법

  1. ==============================

    1.FileUploadClient에서 보내는 요청 페이로드가 서버가 기대하는 것과 일치하지 않는 것 같습니다. 다음을 변경해보십시오 :

    FileUploadClient에서 보내는 요청 페이로드가 서버가 기대하는 것과 일치하지 않는 것 같습니다. 다음을 변경해보십시오 :

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    for(MultipartFile file : multiPartFileList) {
        map.add(file.getName(), new ByteArrayResource(file.getBytes()));
    }
    

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    List<ByteArrayResource> files = new ArrayList<>();
    for(MultipartFile file : multiPartFileList) {
        files.add(new ByteArrayResource(file.getBytes()));
    }
    map.put("files", files);
    

    또한 서버의 메소드 서명을 다음과 같이 변경해보십시오.

    public ResponseEntity<?> uploadFiles(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) {
    

    최신 정보

    여러 파일을 업로드하는 동안 ByteArrayResource의 getFileName이 매번 같은 값을 반환하는지 확인해야합니다. 그렇지 않으면 빈 배열이 항상 생깁니다.

    예 : 나를 위해 다음 작품 :

    고객:

    MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>(); 
    for(MultipartFile file : multiPartFileList) { 
        ByteArrayResource resource = new ByteArrayResource(file.getBytes()) { 
            @Override 
            public String getFilename() { 
                return ""; 
            } 
        }; 
        data.add("files", resource);
    } 
    

    섬기는 사람

    public ResponseEntity<?> upload(@RequestParam("files") MultipartFile[] files){
    
  2. from https://stackoverflow.com/questions/42212557/uploading-a-list-of-multipartfile-with-spring-4-resttemplate-java-client-rest by cc-by-sa and MIT license