Я использую Spring Boot version = '1.4.0.RC1' с Spring Boot Stormpath 1.0.2.Spring Boot multipartfile всегда null
Я пытаюсь использовать многостраничную загрузку файлов, но MultipartFile всегда имеет значение null в контроллере.
Когда я использую @RequestPart ("Файл") инфо: "status":400,"error":"Bad Request","exception":"org.springframework.web.multipart.support.MissingServletRequestPartException","message":"Required request part 'file' is not present"
Когда я использую @RequestPart (имя = "файл", требуемое = ложь), то часть всегда нуль.
Однако, если я добавлю аргумент HttpServletRequest к контроллеру, я могу получить часть файла непосредственно из запроса, поэтому я знаю, что он действительно присутствует.
Это контроллер и в коде ниже checkNotNull(part)
всегда преуспевает и checkNotNull(imageFile)
всегда терпит неудачу:
@PostMapping("{username}/profilePhoto")
public ResponseEntity<?> saveProfilePhoto(@PathVariable("username") String username,
@RequestPart(name = "file", required = false) MultipartFile imageFile,
HttpServletRequest request) {
try {
Part part = request.getPart("file");
checkNotNull(part);
checkNotNull(imageFile);
} catch (IOException | ServletException ex) {
throw InternalServerErrorException.create();
}
// Transfer the multipart file to a temp file
File tmpFile;
try {
tmpFile = File.createTempFile(TMP_FILE_PREFIX, null);
imageFile.transferTo(tmpFile);
} catch (IOException ex) {
log.error("Failed to create temp file", ex);
throw InternalServerErrorException.create();
}
// Execute the use case
updateUserProfilePhoto.execute(username, tmpFile);
// Delete the temp file
FileUtils.deleteQuietly(tmpFile);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
Мой интеграционный тест использует дооснащения:
@Multipart
@POST("users/{username}/profilePhoto")
Call<Void> uploadProfilePhoto(@Path("username") String username,
@Part("file") RequestBody profilePhoto);
...
@Test
public void saveProfilePhoto_shouldSavePhoto() throws IOException {
// Given
String usernamme = usernames[0];
Resource testImageResource = context.getResource("classpath:images/test_image.jpg");
File imageFile = testImageResource.getFile();
RequestBody body = RequestBody.create(okhttp3.MediaType.parse("image/*"), imageFile);
// When
Response<Void> response = getTestApi().uploadProfilePhoto(usernamme, body).execute();
// Then
assertThat(response.code()).isEqualTo(201);
}
Я использую автоматическую конфигурацию, мой единственный обычай конфигурируется конфигурационный класс Stormpath:
@Configuration
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.apply(stormpath());
}
}
UPDATE: Это исходящий запрос. Я не уверен, как включить ведение журнала в самом многопроцессорном резольвере.
2016-08-18 14:44:14.714 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : --> POST http://localhost:8080/users/user1/profilePhoto http/1.1
2016-08-18 14:44:14.714 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Content-Type: multipart/form-data; boundary=fe23ef21-3413-404c-a260-791c6921b2c6
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Content-Length: 181212
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Accept: application/json
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Authorization: Bearer [token]
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 :
2016-08-18 14:44:14.735 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : --fe23ef21-3413-404c-a260-791c6921b2c6
Content-Disposition: form-data; name="file"
Content-Transfer-Encoding: binary
Content-Type: image/*
Content-Length: 180999
file data
--fe23ef21-3413-404c-a260-791c6921b2c6--
2016-08-18 14:44:14.762 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : --> END POST (181212-byte body)
Любые идеи о том, что происходит?
Можете ли вы включить, как выглядит полезная нагрузка запроса? Может быть, даже добавить журнал уровня отладки в «MultipartResolver», который вы используете, чтобы проверить, интерпретирует ли он многочастный компонент запроса? –
@ shawn-clark Это исходящий запрос. Я не уверен, как включить ведение журнала в самом многопроцессорном резольвере. заголовки запросов: Accept: применение/JSON Авторизация: Носитель [маркер аутентификации] Тело запроса: --56436527-d311-4d26-8e67-27fdf6f0edb8 Content-Disposition: формы-данные; Name = "файл" Content-Transfer-Encoding: двоичный Content-Type: изображение/* Content-Length: 180999 [... двоичный ...] --56436527-d311-4d26-8e67- 27fdf6f0edb8-- – JabariP
Поскольку вы используете весеннюю загрузку 1.4, вы можете использовать мое решение, и оно работает – rajadilipkolli