【问题标题】:Spring Boot multipart upload getting null file objectSpring Boot分段上传获取空文件对象
【发布时间】:2017-08-01 15:28:25
【问题描述】:

我在使用 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
    

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

谢谢。

【问题讨论】:

  • 如果你能解决这个问题,请分享..面临同样的问题
  • 我一直在做一个不同的项目,我确实尝试了@Aleixs 的解决方案,但同时,我对服务器进行了巨大的修改,问题再也没有出现过。不确定这是否真的解决了问题。对于那个很抱歉。我关闭了默认的 multipartresolver 并改用 CommonMultipartResolver。

标签: java spring file-upload spring-boot


【解决方案1】:

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

在 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) {
...
}

重要: 在您的客户端中,不要使用任何标题来定义内容类型或边界。我正在使用 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);
*/

希望对你有所帮助。

【讨论】:

  • spring:http:multipart:enabled:false 应该是假还是真?
  • 一定是假的
  • 有什么消息吗?它是否有效@AutoMEta?我和你有同样的问题,但在我的情况下,它只适用于本地主机而不是远程服务器
  • nope..面临同样的问题,而是我将项目版本更改为正常的 spring 版本(没有启动)和旧的 spring 版本,它工作正常。
  • 我使用的是 springs 1.5.6 版本和 commons-fileupload 1.3.2。 @RequestParam 对我不起作用,必须使用 @RequestPart(value = "file", required = false)。我有“multipartResolver”和所有其他建议的属性,但我没有“spring: http: multipart: enabled: false”。我一添加它就一切正常。在我正在开发 1.3.5 的另一个项目中,我从来不需要那个明确的设置,因此我完全没有注意到这个标志。
【解决方案2】:

Spring Boot 2 和 Spring 5 更新

spring.http.multipart.enabled 已被弃用,所以忘记它吧。

MultipartConfigElementMultipartResolver 注册我自己的 bean 对我来说是失败的。

我最终得到了一个带有单个参数 @RequestPart(name = "file") MultipartFile file@PostMapping 方法。添加参数@RequestHeader HttpHeader headers 帮助我确保客户端正在发送所需的带有边界的标头 Content-Type。

我正在使用带有form-data 库和node-fetch 的Node 客户端。这是客户端代码:

const formData = new FormData();
const fileMetadata = {filename: fileName, contentType: 'image/png', knownLength: fs.statSync(pathToFile)};
const formData.append('file', fs.createReadStream(pathToFile), fileMetadata);
fetch(url, {method: 'POST', body: formData});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2014-10-31
    • 1970-01-01
    • 2014-05-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多