2014-09-01 2 views
4

사진을 서버에 업로드하기 위해 내가 작성한 컨트롤러에 문제가 있습니다.다중 요청 요청 봄이 파일 데이터를 바인딩하지 않습니다.

컨트롤러

@RequestMapping(value = "photos", method = RequestMethod.POST) 
@ResponseBody 
public Response uploadPhoto(@RequestPart PhotoMetaData data, 
          @RequestParam String localName, 
          @RequestPart(required = false) MultipartFile file, 
          HttpServletRequest request) { 

    log.info("@uploadPhoto > ip of request: " + request.getRemoteAddr() + ", metaData: " + data); 

    return photosService.storePhoto(data, file, localName); 
} 

문제는 file가 null이다하지만 request 매개 변수를 검사 할 때 요청이 명확하게 각 또한이 해야하는있다 contentType이 3 멀티 PARAMS을 가지고 있지만 파일이 긴 문자열입니다.

debug capturing

안드로이드 응용 프로그램은이 코드를 호출한다. 나는 다중 요청을 만들기 위해 OkHttp를 사용하고있다. 코드 :

MediaType jsonMediaType = MediaType.parse("application/json"); 
RequestBody requestBody = new MultipartBuilder() 
      .type(MultipartBuilder.FORM)                  
      .addPart(Headers.of("Content-Disposition", "form-data; name=\"data\""),           
       RequestBody.create(jsonMediaType, photoMetaDataStr))                          
      .addPart(Headers.of("Content-Disposition", "form-data; name=\"localName\""), 
       RequestBody.create(MediaType.parse("text/plain"), localName.getPath())) 
      .addPart(Headers.of("Content-Disposition", "form-data; name=\"file\""), 
       RequestBody.create(MediaType.parse("image/jpeg"), new File(localName.getPath()))) 
                .build(); 

    Request request = new Request.Builder().url(url).post(requestBody).build(); 

    final Response response = client.newCall(request) 
            .execute(); 

------ 편집 ------------

관련 콩 :

@Bean 
public MultipartResolver multipartResolver() { 

    return new CommonsMultipartResolver(); 
} 

---- 편집 2 - --- 컨트롤러 서명을 변경 한 후 파일이 필요합니다. 예외가 발생합니다.

---- EDIT 3 ------ 광범위한 테스트를 통해 문제가 발생한 것 같습니다. 내가 okHttp를 사용하는 방법 der를 사용하여 멀티 파트 요청을 서버에 보냅니다. 우체부 클라이언트를 사용하여 통화 시간에 대한 성공적인

error with request org.springfra[email protected]3d854606 
org.springframework.web.multipart.support 
.MissingServletRequestPartException: Required request part 'file' is not present. 

감사했고

로이

+0

'MultipartFile' 매개 변수에 대해'@ RequestParam' 대신'@ RequestPart'를 시도하십시오. –

+0

@ M.Deinum 귀하의 회신에 감사드립니다. '@ RequestParam'을'@ RequestPart '로 변경하는 것을 포함하여 모든 가능한 조합을 이미 시도했습니다. 작동하지 않는다 – royB

+0

작동하지 않으면 구성에 결함이있는 것입니다. 모든 것이'String' 또는'String []'이라는 사실은 웹의 작동 방식만큼이나 이상하지 않습니다. 매개 변수는 나중에 변환됩니다. 그러나'@ RequestParam'이 아닌'@ RequestPart' 여야합니다.'String'에서 요청 유형으로의 변환은 둘 사이에서 완전히 다르게 처리됩니다. 디버그 정보로 컴파일되었는지 확인한 후 디버깅을 위해'required'를 true로 설정하면 (그리고 어떤 에러가 나올지),'@RequestPart (value = "file"), required = false)'를 사용해보십시오. –

답변

1

도움 그럼 난 그냥 요청 내용 전송 인코딩에 추가하여 문제를 해결할 수 있었다 머리글.

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM) 
                .addPart(Headers.of("Content-Disposition", "form-data; name=\"data\""), 
                  RequestBody.create(jsonMediaType, GsonInstance.getInstance() 
                              .toJson(photoMetaData))) 
                .addPart(Headers.of("Content-Disposition", "form-data; name=\"file\"; filename=\"localName\"", "Content-Transfer-Encoding", "binary"), 
                  RequestBody.create(MediaType.parse("image/jpeg"), new File(localName.getPath()))) 
                .build(); 

나는 그것이 왜 중요한지 잘 모르겠습니다. 내 이해를 위해 contentType이 image 일 때 기본 전송 인코딩은 바이너리입니다. okHttp의 사소한 버그일까요?