2014-09-01 4 views
4

У меня возникла проблема с контроллером, который я написал для загрузки фотографий на сервер.Многостраничный запрос spring не связывает данные файла

контроллер

@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 равна нулю, но при проверке request параметра запроса, очевидно, имеет 3 многокомпонентные Params, каждый из которых также это предполагается CONTENTTYPE но файл является длинная строка.

debug capturing

Android приложение называет этот код. Я использую 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(); 
} 

---- EDIT 2 - --- после изменения сигнатуры контроллера, чтобы файл был необходим, я получаю исключение:

---- EDIT 3 ------ После обширного тестирования я заметил, что проблема, вероятно, как я использую okHttp в чтобы отправить многостраничный запрос на сервер. используя Почтальон клиента, вызов был успешным

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

Спасибо за ваше время и помочь

Роя

+0

Попробуйте '@ RequestPart' вместо' @ RequestParam' для параметра 'MultipartFile'. –

+0

@ M.Deinum благодарит за ваш ответ. уже пробовал все возможные комбинации, включая изменение '@ RequestParam' на' @ RequestPart'. не работает – royB

+0

Если он не работает, ваша конфигурация неверна. Тот факт, что все является строкой или строкой [], не является странным, так как это работает в Интернете, после этого параметры преобразуются. Однако это должно быть '@ RequestPart', а не' @ RequestParam', преобразование из 'String' в тип запроса обрабатывается совсем по-другому между ними. Удостоверьтесь, что вы компилируете с помощью отладочной информации else try '@RequestPart (value =" file "), required = false)' для отладки вы можете попробовать и сделать 'required' true (и посмотреть, какая ошибка выплевывается). –

ответ

1

Ну я был в состоянии решить эту проблему, просто добавив к запросу Content-Transfer-Encoding заголовок.

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 - это изображение. возможно, это небольшая ошибка с okHttp?

Смежные вопросы