멀티파트 파일 업로드 스프링 부트
Spring Boot을 사용하고 있는데 컨트롤러를 사용하여 멀티파트 파일 업로드를 받고 싶습니다.파일을 보낼 때 415 unsupported content type response라는 오류가 계속 표시되며 컨트롤러에 접속할 수 없습니다.
There was an unexpected error (type=Unsupported Media Type, status=415).
Content type 'multipart/form-data;boundary=----WebKitFormBoundary1KvzQ1rt2V1BBbb8' not supported
html/jsp 페이지에서 form: action을 사용하여 전송하고 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 셋업 포함
@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;
}
보시는 바와 같이 consumes type을 multipart/form-data로 설정했지만 멀티파트가 전송될 때는 경계 파라미터를 가지고 랜덤 경계 문자열을 배치해야 합니다.
컨트롤러의 콘텐츠 유형을 컨트롤러 설정에 맞게 설정하거나 컨트롤러 설정에 맞게 요청을 변경하는 방법을 알려 주시겠습니까?
보내려는 내 시도는...시도 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());
@RequestBody MultipartFile[] submissions
그래야 한다
@RequestParam("file") MultipartFile[] submissions
파일은 요청 본문이 아니라 일부이며 기본 제공이 없습니다.HttpMessageConverter
이 요구는, 다음의 배열로 변환할 수 있습니다.MultiPartFile
.
교환할 수도 있습니다.HttpServletRequest
와 함께MultipartHttpServletRequest
개별 부품의 헤더에 액세스할 수 있습니다.
다음과 같은 컨트롤러 방식을 사용할 수 있습니다.
@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 폼클라이언트 측을 사용합니다.
<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/
Spring Boot의 최신 버전에서는 여러 파일을 쉽게 업로드할 수 있습니다.브라우저 측에서는 표준 HTML 업로드 양식만 있으면 되지만, 업로드할 파일당 하나의 입력 요소(매우 중요하며, 아래 예에서는 모두 동일한 요소 이름)가 있습니다.
다음으로 서버의 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);
}
그게 까다로운 부분이에요.즉, 각각 "파일"이라는 이름의 여러 입력 요소를 생성하는 방법과 요청 매개 변수로 Multipart File[](어레이)를 사용하는 방법을 아는 것은 어려운 일이지만 단순합니다.MultipartFile 엔트리의 처리 방법에 대해서는 설명하지 않겠습니다.이미 MultipartFile 엔트리에 대한 문서가 많이 있기 때문입니다.
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5120MB");
factory.setMaxRequestSize("5120MB");
return factory.createMultipartConfig();
}
원두를 정의하는 클래스에 넣습니다.
@RequestPart
@RequestParam
public UploadFile upload(@RequestPart(name = "file") MultipartFile multipartFile{
//your code to process filee
}
컨트롤러에서 방법은 다음과 같습니다.
@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
@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);
}
}
언급URL : https://stackoverflow.com/questions/25699727/multipart-file-upload-spring-boot
'programing' 카테고리의 다른 글
테이블에서 값이 null이 아닌 열을 선택하려면 어떻게 해야 합니까? (0) | 2023.03.18 |
---|---|
url 인수(쿼리 문자열)를 Angular의 HTTP 요청에 전달하려면 어떻게 해야 합니까? (0) | 2023.03.13 |
MUI에서 타이포그래피 텍스트 색상 설정 (0) | 2023.03.13 |
사용자 지정 게시 유형 및 카테고리에 따라 표시에 카테고리 추가 (0) | 2023.03.13 |
테이블에 날짜 값을 삽입하는 방법 (0) | 2023.03.13 |