Загрузка многостраничного файла Spring Загрузка
Im, использующий Spring Загрузите и хотите использовать контроллер для получения многостраничной загрузки файла.
При отправке файла я получаю ответ ошибка 415 неподдерживаемого типа содержимого, и контроллер никогда не достигает
There was an unexpected error (type=Unsupported Media Type, status=415).
Content type 'multipart/form-data;boundary=----WebKitFormBoundary1KvzQ1rt2V1BBbb8' not supported
Ive попытался отправить с помощью формы: действие на странице html/jsp, а также в автономное клиентское приложение, которое использует RestTemplate. Все попытки дают тот же результат
multipart/form-data;boundary=XXXXX not supported.
Кажется, из многостраничной документации, что пограничный параметр должен быть добавлен к многостраничной загрузке, однако это, похоже, не соответствует получателю, принимающему "multipart/form-data"
Мой метод контроллера настроен следующим образом
@RequestMapping(value = "/things", method = RequestMethod.POST, consumes = "multipart/form-data" ,
produces = { "application/json", "application/xml" })
public ResponseEntity<ThingRepresentation> submitThing(HttpServletRequest request,
@PathVariable("domain") String domainParam,
@RequestParam(value = "type") String thingTypeParam,
@RequestBody MultipartFile[] submissions) throws Exception
С помощью Bean Setup
@Bean
public MultipartConfigElement multipartConfigElement() {
return new MultipartConfigElement("");
}
@Bean
public MultipartResolver multipartResolver() {
org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new org.springframework.web.multipart.commons.CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(1000000);
return multipartResolver;
}
Как вы можете видеть, я установил тип потребления в "multipart/form-data", но при отправке multipart он должен иметь граничный параметр и помещает случайную границу.
Кто-нибудь может рассказать мне, как я могу установить тип содержимого в контроллере для соответствия или изменения моего запроса в соответствии с настройкой моего контроллера?
Мои попытки отправить...
Попытка 1...
<html lang="en">
<body>
<br>
<h2>Upload New File to this Bucket</h2>
<form action="http://localhost:8280/appname/domains/abc/things?type=abcdef00-1111-4b38-8026-315b13dc8706" method="post" enctype="multipart/form-data">
<table width="60%" border="1" cellspacing="0">
<tr>
<td width="35%"><strong>File to upload</strong></td>
<td width="65%"><input type="file" name="file" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit" value="Add" /></td>
</tr>
</table>
</form>
</body>
</html>
Попытка 2....
RestTemplate template = new RestTemplate();
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("file", new FileSystemResource(pathToFile));
try{
URI response = template.postForLocation(url, parts);
}catch(HttpClientErrorException e){
System.out.println(e.getResponseBodyAsString());
}
Попытка 3...
FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
formHttpMessageConverter.setCharset(Charset.forName("UTF8"));
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add( formHttpMessageConverter );
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("file", new FileSystemResource(path));
HttpHeaders imageHeaders = new HttpHeaders();
imageHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> imageEntity = new HttpEntity<MultiValueMap<String, Object>>(map, imageHeaders);
ResponseEntity e= restTemplate.exchange(uri, HttpMethod.POST, imageEntity, Boolean.class);
System.out.println(e.toString());
Ответы
Ответ 1
@RequestBody MultipartFile[] submissions
должен быть
@RequestParam("file") MultipartFile[] submissions
Файлы не являются телом запроса, они являются его частью и нет встроенного HttpMessageConverter
, который может преобразовать запрос в массив MultiPartFile
.
Вы также можете заменить HttpServletRequest
на MultipartHttpServletRequest
, что дает вам доступ к заголовкам отдельных частей.
Ответ 2
Вы можете просто использовать контроллер, например:
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<?> uploadFile(
@RequestParam("file") MultipartFile file) {
try {
// Handle the received file here
// ...
}
catch (Exception e) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(HttpStatus.OK);
} // method uploadFile
Без каких-либо дополнительных конфигураций для Spring Boot.
Используя следующую клиентскую сторону html form:
<html>
<body>
<form action="/uploadFile" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
</body>
</html>
Если вы хотите установить ограничения на размер файлов, вы можете сделать это в application.properties
:
# File size limit
multipart.maxFileSize = 3Mb
# Total request size for a multipart/form-data
multipart.maxRequestSize = 20Mb
Более того, чтобы отправить файл с Ajax, посмотрите здесь:
http://blog.netgloo.com/2015/02/08/spring-boot-file-upload-with-ajax/
Ответ 3
Последняя версия SpringBoot позволяет легко и просто загружать несколько файлов . На стороне браузера вам просто нужна стандартная форма отправки HTML, но с несколькими элементами ввода (по одному на файл для загрузки, что очень важно), все из которых имеют одинаковые файлы с именами элементов (name= "" для примера ниже)
Затем в вашем классе Spring @Controller на сервере все, что вам нужно, выглядит примерно так:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<?> upload(
@RequestParam("files") MultipartFile[] uploadFiles) throws Exception
{
...now loop over all uploadFiles in the array and do what you want
return new ResponseEntity<>(HttpStatus.OK);
}
Это сложные штуки. То есть, зная, что нужно создать несколько элементов ввода, каждый из которых называется "файлы", и знать, использовать MultipartFile [] (массив), поскольку параметр запроса - это сложные вещи, которые нужно знать, но это просто так просто. Я не буду разбираться в обработке записи MultipartFile, потому что там уже много документов.
Ответ 4
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5120MB");
factory.setMaxRequestSize("5120MB");
return factory.createMultipartConfig();
}
поместите его в класс, где вы определяете beans
Ответ 5
@RequestMapping(value="/add/image", method=RequestMethod.POST)
public ResponseEntity upload(@RequestParam("id") Long id, HttpServletResponse response, HttpServletRequest request)
{
try {
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest)request;
Iterator<String> it=multipartRequest.getFileNames();
MultipartFile multipart=multipartRequest.getFile(it.next());
String fileName=id+".png";
String imageName = fileName;
byte[] bytes=multipart.getBytes();
BufferedOutputStream stream= new BufferedOutputStream(new FileOutputStream("src/main/resources/static/image/book/"+fileName));;
stream.write(bytes);
stream.close();
return new ResponseEntity("upload success", HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
return new ResponseEntity("Upload fialed", HttpStatus.BAD_REQUEST);
}
}
Ответ 6
В контроллере ваш метод должен быть:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<SaveResponse> uploadAttachment(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
....
Кроме того, вам необходимо обновить application.yml(или application.properties), чтобы поддерживать максимальный размер файла и размер запроса.
spring:
http:
multipart:
max-file-size: 5MB
max-request-size: 20MB