2016-08-01 5 views
0

Невозможно понять это, несмотря ни на что. Я Отправляя эту завиток команды:Spring Boot + метод контроллера multipart/form-data

curl -v -F name=countries.zip -F [email protected] http://localhost:8080/rest 

У меня есть Spring загрузочной 1.4 приложения с аннотированным @RestController со следующим методом:

@RequestMapping(consumes = {"multipart/form-data"}, method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, path = {"/rest", "/rest/**"}) 
public void handleMultipartRestApiRequest(MultipartHttpServletRequest request, HttpServletResponse response, @RequestPart(value = "filedata", required = false) MultipartFile filedata) throws Exception { 
    r... 
} 

FileData переменным всегда нулевая, и объект запроса всегда показывает 0 файлов.

Я пробовал несколько конфигураций с помощью MultipartResolver. Вот моя последняя:

@Bean 
public MultipartResolver multipartResolver() { 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
    multipartResolver.setMaxUploadSize(5000000); 
    multipartResolver.setMaxInMemorySize(5000000); 
    multipartResolver.setDefaultEncoding("utf-8"); 
    return multipartResolver; 
} 

Я также вручную застрял их в моих application.properties просто быть 1000% уверен, что это не отключено:

multipart.enabled=true 

spring.http.multipart.enabled = истинный

и для хорошей меры, вот заголовки запроса:

* Connected to localhost (::1) port 8080 (#0) 
> POST /rest HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Length: 817999 
> Expect: 100-continue 
> Content-Type: multipart/form-data; boundary=------------------------7d3f4606455e862b 
> 

кто-нибудь есть ключ, почему Кажется, я не могу видеть файл на моем контроллере?

UPDATE 1:

Если я копать достаточно глубоко в объект запроса и добраться до org.catalina.connector.Request объекта, есть ArrayList элементов ApplicationPart, которые содержат DiskFileItem, что, кажется, содержат информацию о файл, который я пытаюсь загрузить. Это фактически коллекция, которая возвращается при вызове request.getParts(). Путь расположения файла пункт некоторый длинный путь TMP:

/private/var/folders/n8/15d6vbhj0692cslf3cx8c1jm0000gn/T/tomcat.6840182548028446450.8080/work/Tomcat/localhost/myapp 

Однако он также говорит, что тип контента приложения/октет-поток, размер -1, и некоторые другие странности, как «isFormField» неверна даже хотя я указываю его как поле формы в моей команде curl. Таким образом, Spring вызывает правильный метод обработки запроса multipart/form-data, но, тем не менее, «часть» информации, похоже, считает, что это октетный поток.

+0

Я скромно думаю, что вы не создали экземпляр вашего многостраничного объекта. Например: MultipartFile filedata = fileToBeAdded.getSomething(); –

+0

Не уверен, что вы имеете в виду ... Я ожидаю файл в запросе. Если я делаю что-то вроде Map map = request.getFileMap() ;, карта пуста. – Bal

+0

Попробуйте '@ RequestParam' вместо' @ RequestPart'. –

ответ

-1

Я поделился своей функцией, чтобы загрузить файл с помощью MultipartFile, нет необходимости в распознавателе или компоненте, но вы можете отправлять только файл, а не с другим типом param или body.

@RequestMapping(value = "/updatePhoto", method = RequestMethod.POST) 
public @ResponseBody 
    ResponseEntity<?> updateUsuario(@RequestParam("file") MultipartFile file, 
     OAuth2Authentication authentication) { 
    try { 
     User user = (User) authentication.getPrincipal(); 
     Usuarios u = usuariosDAO.findUsuarioByUsername(user.getUsername()); 
     if (file.getName().isEmpty() == false) { 
      InputStream inputStream = file.getInputStream(); 
      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
      int nRead; 
      byte[] bytes = new byte[16384]; 
      while ((nRead = inputStream.read(bytes, 0, bytes.length)) != -1) { 
       buffer.write(bytes, 0, nRead); 
      } 
      buffer.flush(); 
      u.setImagen(buffer.toByteArray()); 
      usuariosDAO.updateUsuario(u); 
     } 
    } catch (Exception e) { 
     return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

В этом случае я загружаю фотографию для пользователя профиля и преобразую его в массив байтов. Затем он сохраняется в базе данных. надеюсь, это поможет вам

+0

Спасибо Пауло, но моя проблема в переменной MultipartFile всегда равна нулю, и я не могу понять, почему. – Bal

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