Spring Boot分段上传获取空文件对象

Vin*_*Lam 5 java spring file-upload spring-boot

我在使用 Spring Boot 1.5.2 实现分段文件上传时遇到问题。

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

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

  • 如果它可以上传,那么在剩下的时间里它会上传得很好。
  • 如果没有,它不会工作,直到我重新启动服务器(可能不止一次)

这是映射。

@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);
        }
}
Run Code Online (Sandbox Code Playgroud)

还有FileBucket对象

public class FileBucketConversation {

    private MultipartFile file;

    public MultipartFile getFile() {
        return file;
    }

    public void setFile(MultipartFile file) {
        this.file = file;
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法来实现文件上传,但仍然遇到同样的情况。

  1. 使用StandardServletMultipartResolver

    @Bean(name = "multipartResolver")
    public StandardServletMultipartResolver resolver() {
        return new StandardServletMultipartResolver();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用CommonsMultipartResolverv1.3.2。

    @Bean(name="multipartResolver")
    public CommonsMultipartResolver multipartResolver () {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setMaxUploadSize(MAX_FILE_SIZE);
        return resolver;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    压倒性的MultipartFilter

    @Bean
    @Order(0)
    public MultipartFilter multipartFile() {
        MultipartFilter multipartFilter = new MultipartFilter();
        multipartFilter.setMultipartResolverBeanName("multipartResolver");
        return multipartFilter;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. spring.http.multipart在属性文件中启用

    spring.http.multipart.enabled=true
    spring.http.multipart.max-file-size=20Mb
    spring.http.multipart.max-request-size=20Mb
    
    Run Code Online (Sandbox Code Playgroud)

我真的不知道从哪里开始寻找。这个问题偶尔会发生,不是每次启动服务器时都会发生,而是大多数时候都会发生。希望有人可以帮助我。

谢谢。

Ale*_*rra 4

我遇到了同样的问题,这是我的解决方案:

在application.yml中:

spring:
  http:
    multipart:
      enabled: false
Run Code Online (Sandbox Code Playgroud)

在配置中:

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

@Bean
public MultipartResolver multipartResolver() {
    return new CommonsMultipartResolver();
}
Run Code Online (Sandbox Code Playgroud)

在休息控制器中:

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

重要提示: 在您的客户端中,不要使用任何标头来定义内容类型或边界。我正在使用 Angular 4,当我从代码中删除这些标头时,它就可以工作了(我只设置了用户令牌):

/* 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);
*/
Run Code Online (Sandbox Code Playgroud)

我希望这对你有帮助。

  • 一定是假的 (2认同)