java – Multipart文件上传Spring Boot

前端之家收集整理的这篇文章主要介绍了java – Multipart文件上传Spring Boot前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 Spring Boot并想使用Controller来接收多部分文件上传.
发送文件时,我不断收到错误415不支持内容类型响应,并且控制器永远不会被访问
There was an unexpected error (type=Unsupported Media Type,status=415).
Content type 'multipart/form-data;boundary=----WebKitFormBoundary1KvzQ1rt2V1BBbb8' not supported

我试图在html / jsp页面以及使用RestTemplate的独立客户端应用程序中发送使用form:action.所有尝试都给出相同的结果

multipart / form-data; boundary = XXXXX不支持.

从multipart文档看来,边界参数必须添加到多部分上传,但是这似乎与控制器接收“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;
 }

如您所见,我已将消耗类型设置为“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>&nbsp;</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数组.

您还可以使用MultipartHttpServletRequest替换HttpServletRequest,该对象可以访问各个部分的头文件.

猜你在找的Java相关文章