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

标签 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);
        }
}

还有 FileBucket 对象

public class FileBucketConversation {

    private MultipartFile file;

    public MultipartFile getFile() {
        return file;
    }

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

我试过几种实现文件上传的方法,还是一样的情况。

  1. 使用 StandardServletMultipartResolver

    @Bean(name = "multipartResolver")
    public StandardServletMultipartResolver resolver() {
        return new StandardServletMultipartResolver();
    }
    
  2. 使用 CommonsMultipartResolver v1.3.2。

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

    覆盖MultipartFilter

    @Bean
    @Order(0)
    public MultipartFilter multipartFile() {
        MultipartFilter multipartFilter = new MultipartFilter();
        multipartFilter.setMultipartResolverBeanName("multipartResolver");
        return 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:
      enabled: false

在配置中:

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

@Bean
public MultipartResolver multipartResolver() {
    return new CommonsMultipartResolver();
}

在 RestController 中:

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

重要: 在您的客户端中,不要使用任何 header 来定义内容类型或边界。我正在使用 Angular 4,当我从我的代码中删除这些 header 时它起作用了(我只设置了用户 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);
*/

希望对你有帮助

关于java - Spring Boot 分段上传获取空文件对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732725/

相关文章:

java - 如何配置 rmi 服务导出端点地址?

file-upload - 允许第三方用户将文件上传到您的 AWS S3 fs

c# - ASP.NET 文件上传

java - 向 GCM 服务器发送消息(使用 Java)时出现异常 [errorCode=MismatchSenderId]

java - Unity-Android _ CommandInvokationFailure : Unable to convert classes into dex format

Java HttpPost 到 php API

node.js - 将视频文件上传到 Amazon S3 时出现 413 Request Entity Too Large

java - 为什么我的垂直乘积求和程序出现 "index out of bounds"异常?

spring - 无法使用 Spring MockMvc 将正文附加到我的 POST 请求

java - 从 Spring 后台订阅 RxJava Observable