web-dev-qa-db-ja.com

マルチパートファイルアップロードスプリングブート

Spring Bootを使用していて、コントローラーを使用してマルチパートファイルアップロードを受信したい。ファイルを送信するときにerror 415 unsupported content type応答を取得し続け、コントローラーに到達しない

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 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;
 }

ご覧のように、consumsタイプを「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>&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());
27
Rob McFeely
@RequestBody MultipartFile[] submissions

あるべき

@RequestParam("file") MultipartFile[] submissions

ファイルはリクエストの本文ではなく、その一部であり、リクエストをHttpMessageConverterの配列に変換できる組み込みのMultiPartFileはありません。

HttpServletRequestMultipartHttpServletRequestに置き換えることもできます。これにより、個々のパーツのヘッダーにアクセスできます。

22
a better oliver

次のようなcontrollerメソッドを使用できます。

@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 /

23
Andrea

SpringBootの最新バージョンでは、複数のファイルのアップロードも非常に簡単になります。ブラウザ側では、標準のHTMLアップロードフォームが必要ですが、複数の入力要素(アップロードするファイルごとに1つ、非常に重要です)、すべて同じ要素名(name = "files"下の例では)

次に、サーバーの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);
}

それらは難しい部分です。つまり、それぞれが「files」という名前の複数の入力要素を作成すること、およびリクエストパラメータとしてMultipartFile [](配列)を使用することを知ることは、知っておくべきトリッキーなことですが、それは簡単です。 MultipartFileエントリの処理方法については説明しません。既に多くのドキュメントがあります。

6
user2080225
   @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize("5120MB");
        factory.setMaxRequestSize("5120MB");
        return factory.createMultipartConfig();
    }

beanを定義するクラスに配置します

4
Ashutosh Jha

Controllerでは、メソッドは次のようになります。

@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
1
THIMIRA
@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);
    }   
}
1
Vikki Kamboj