Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导多部分上载获取空文件对象_Java_Spring_File Upload_Spring Boot - Fatal编程技术网

Java Spring引导多部分上载获取空文件对象

Java Spring引导多部分上载获取空文件对象,java,spring,file-upload,spring-boot,Java,Spring,File Upload,Spring Boot,我在使用SpringBoot1.5.2实现多部分文件上传时遇到问题 在这种情况下,我有一个映射来处理文件上传过程。问题是,我要么能够很好地上传文件,要么在FileBucket对象中的所有属性上获得null 如果我不关闭服务器,这种情况将永远存在 如果它可以上传,那么在剩下的时间里它都可以上传 如果没有,它将无法工作,直到我重新启动服务器(可能不止一个) 时间) 这是地图 @RequestMapping(value = {"/api/upload"}, method = RequestMeth

我在使用SpringBoot1.5.2实现多部分文件上传时遇到问题

在这种情况下,我有一个映射来处理文件上传过程。问题是,我要么能够很好地上传文件,要么在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);
        }
}
我尝试了几种实现文件上传的方法,但仍然存在同样的情况

  • 使用
    StandardServletMultipartResolver

    @Bean(name = "multipartResolver")
    public StandardServletMultipartResolver resolver() {
        return new StandardServletMultipartResolver();
    }
    
  • 使用
    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;
    }
    
  • 在属性文件中启用
    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) {
    ...
    }
    
    重要提示: 在客户端中,不要使用任何标题来定义内容类型或边界。我使用的是Angular 4,当我从代码中删除这些头时,它可以工作(我只设置了用户令牌):


    我希望这对您有所帮助。

    Spring Boot 2和Spring 5的更新

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

    MultipartConfigElement
    MultipartResolver
    注册我自己的bean为我破坏了它

    我最终得到了一个带有单个参数的
    @PostMapping
    方法,
    @RequestPart(name=“file”)MultipartFile文件。添加一个参数
    @RequestHeader-HttpHeader-headers
    帮助我确保客户端发送的是带有边界的所需标题内容类型

    我正在使用一个节点客户端与库和。以下是客户端代码:

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

    spring:http:multipart:enabled:false应该是false还是true?它必须是false有什么消息吗?它在@AutoMEta中起作用了吗?我和你有同样的问题,但在我的例子中,它只在本地主机上工作,而不在远程服务器上。面对同样的问题,我将项目版本改为正常的spring版本(没有启动)和旧的spring版本,在那里工作正常。我使用的是springs 1.5.6版本和commons fileupload 1.3.2@RequestParam不适用于我,必须使用@RequestPart(value=“file”,required=false)。我有“multipartResolver”和所有其他建议的属性,但没有“spring:http:multipart:enabled:false”。我一加上它,一切都好了。我的另一个项目是spring 1.3.5,我从来都不需要这个明确的设置,因此我完全没有注意到这个标志。如果你能解决这个问题,请分享。面对同样的问题,我一直在从事不同的项目,我尝试了@Aleix的解决方案,但同时,我对服务器做了巨大的修改,问题再也没有出现过。不确定这是否真的解决了问题。很抱歉。我关闭了默认的multipartresolver,改用CommonMultipartResolver。
    /* 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);
    */
    
    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});