Spring Boot分段上传得到空文件对象 [英] Spring Boot multipart upload getting null file object

查看:334
本文介绍了Spring Boot分段上传得到空文件对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用spring boot 1.5.2实现多部分文件上传时出现问题。

这是情况,我有一个映射来处理文件上传过程。当我启动spring服务器时,它启动时没有任何错误。问题是我要么能够完美地上传文件,要么在FileBucket对象的所有属性上为null

如果我不关闭服务器,这种情况将永远保持。


  • 如果可以上传,则会在剩下的时间内上传。


  • $ b $如果不是这样,它将不会工作,直到我重新启动服务器(可能超过
    时间) b

    这是映射。

      @RequestMapping(value = {/ api / upload} ,method = RequestMethod.POST)
    public ResponseEntity< Map< String,Integer>>上传(@Valid FileBucket fileBucket,BindingResult结果)抛出IOException {
    Session session = sessionFactory.openSession();
    User user =(User)session.load(User.class,getUserId());

    地图< String,Integer> model = new HashMap< String,Integer>();
    if(result.hasErrors()){
    System.out.println(validation errors);
    System.out.println(result);
    session.close();
    返回新的ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
    } else {
    int documentId = saveDocument(fileBucket,user);
    model.put(documentId,documentId);
    session.close();
    返回新的ResponseEntity< Map< String,Integer>>(model,HttpStatus.OK);




    $ b $ FileBucket < code $>



    $ private私人MultipartFile文件;

    public MultiFile getFile(){
    return file;
    }

    public void setFile(MultipartFile file){
    this.file = file;






    我已经尝试了很多方法来实现文件上传,仍然有相同的情况。使用 StandardServletMultipartResolver




    1.   @Bean(name =multipartResolver)
      Standard StandardServletMultipartResolver解析器(){
      返回新的StandardServletMultipartResolver ();

      $ / code $ / pre $使用 CommonsMultipartResolver
    2. c> v1.3.2。

        @Bean(name =multipartResolver)
      public CommonsMultipartResolver multipartResolver(){
      CommonsMultipartResolver解析器= new CommonsMultipartResolver();
      resolver.setMaxUploadSize(MAX_FILE_SIZE);
      返回解析器;

      覆盖 MultipartFilter

        @Bean 
      @Order(0)
      public MultipartFilter multipartFile(){
      MultipartFilter multipartFilter = new MultipartFilter();
      multipartFilter.setMultipartResolverBeanName(multipartResolver);
      返回multipartFilter;


    3. 启用 spring.http.multipart 在属性文件中

        spring.http.multipart.enabled = true 
      spring.http。 multipart.max-file-size = 20Mb
      spring.http.multipart.max-request-size = 20Mb


    我真的不知道从哪里开始寻找。问题偶尔会发生,但每次启动服务器时都不会发生这种情况,但大部分时间都是这样。希望有人能帮助我。



    谢谢。

    解决方案

    我有同样的问题,是我的解决方案:

    在application.yml中:

      spring: 
    http:
    multipart:
    启用:false



      import org.springframework.web.multipart.MultipartResolver; 
    import org.springframework.web.multipart.commons.CommonsMultipartResolver;
    ...

    @Bean
    public MultiResolver multipartResolver(){
    return new CommonsMultipartResolver();



    $ b在RestController中:


    pre $ @PostMapping(value =api / upload,consumes =multipart / form-data)
    public void enablePurchase(@RequestHeader HttpHeaders header,
    FileBucketConversation fileBucketConversation){
    ...
    }

    重要: / strong>
    在您的客户端中,请勿使用任何标题来定义内容类型或边界。我使用的是Angular 4,当我从代码中删除这些头文件时,它可以工作(我只设置了用户令牌):

    pre $ / *不要使用这个:
    让boundary =ABDCE;
    headers.append(Content-type,multipart / form-data; boundary =+ boundary);
    headers.append(enctype,multipart / form-data; boundary =+ boundary);
    headers.append(boundary,boundary);
    * /

    我希望这可以帮到您。

    I am getting a problem while implementing multipart file upload using spring boot 1.5.2.

    Here is the situation, I have a mapping to handle file upload process.While I start the spring server, it starts without any error. The problem is that I would either able to upload the file perfectly fine or I would get null on all attribute in FileBucket object.

    This situation would stay forever if I do not shutdown the server.

    • If it could upload, it would upload fine for the rest of the time.
    • If not, it won't work until I restart the server(likely more than one time)

    Here is the mapping.

    @RequestMapping(value = {"/api/upload"}, method = RequestMethod.POST)
    public ResponseEntity<Map<String, Integer>> upload(@Valid FileBucket fileBucket, BindingResult result) throws IOException {
            Session session = sessionFactory.openSession();
            User user = (User) session.load(User.class, getUserId());
    
            Map<String, Integer> model = new HashMap<String, Integer>();
            if (result.hasErrors()) {
                System.out.println("validation errors");
                System.out.println(result);
                session.close();
                return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
            } else {
                int documentId = saveDocument(fileBucket, user);
                model.put("documentId", documentId);
                session.close();
                return new ResponseEntity<Map<String, Integer>>(model, HttpStatus.OK);
            }
    }
    

    And the FileBucket object

    public class FileBucketConversation {
    
        private MultipartFile file;
    
        public MultipartFile getFile() {
            return file;
        }
    
        public void setFile(MultipartFile file) {
            this.file = file;
        }
    }
    

    I have tried few ways to implement file upload, and still having the same situation.

    1. Using StandardServletMultipartResolver.

      @Bean(name = "multipartResolver")
      public StandardServletMultipartResolver resolver() {
          return new StandardServletMultipartResolver();
      }
      

    2. Using CommonsMultipartResolver v1.3.2.

      @Bean(name="multipartResolver")
      public CommonsMultipartResolver multipartResolver () {
          CommonsMultipartResolver resolver = new CommonsMultipartResolver();
          resolver.setMaxUploadSize(MAX_FILE_SIZE);
          return resolver;
      }
      

      overriding MultipartFilter

      @Bean
      @Order(0)
      public MultipartFilter multipartFile() {
          MultipartFilter multipartFilter = new MultipartFilter();
          multipartFilter.setMultipartResolverBeanName("multipartResolver");
          return multipartFilter;
      }
      

    3. Enable spring.http.multipart in properties file

      spring.http.multipart.enabled=true
      spring.http.multipart.max-file-size=20Mb
      spring.http.multipart.max-request-size=20Mb
      

    I really have no clue where to start looking. The problem happen occasionally, it do not happen every time I start the server but most of the time. Hoping some one could help me.

    Thank you.

    解决方案

    I had the same problem, this is my solution:

    In application.yml:

    spring:
      http:
        multipart:
          enabled: false
    

    In configuration:

    import org.springframework.web.multipart.MultipartResolver;
    import org.springframework.web.multipart.commons.CommonsMultipartResolver;
    ...
    
    @Bean
    public MultipartResolver multipartResolver() {
        return new CommonsMultipartResolver();
    }
    

    In RestController:

    @PostMapping(value = "api/upload", consumes = "multipart/form-data") 
    public void enablePurchase(@RequestHeader HttpHeaders headers,
                               FileBucketConversation fileBucketConversation) {
    ...
    }
    

    Important: In your client don't use any header to define the Content-type or boundary. I'm using Angular 4 and when I remove these headers from my code it works (I only set the User token):

    /* DON'T USE THIS:
    let boundary = "ABDCE";
    headers.append("Content-type", "multipart/form-data;boundary=" + boundary);
    headers.append("enctype", "multipart/form-data;boundary=" + boundary);
    headers.append("boundary", boundary);
    */
    

    I hope this help you.

    这篇关于Spring Boot分段上传得到空文件对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆