在Multipart Spring MVC文件上传中未删除.tmp文件

时间:2016-12-21 16:46:05

标签: java json spring spring-mvc multipartform-data

我已经实现了一个Spring MVC REST服务,该服务接受包含文件上传和JSON主体作为构成部分的多部分消息。以下是涉及的主要课程:

我的控制器:

    @RestController
    public class MyController {

    @Autowired
    private MyService myService;

    @RequestMapping(value = "/publish", method = RequestMethod.POST,
            consumes = "multipart/form-data", produces = "application/json")
    public PublishContentResponse publishContent(@RequestPart("json") PublishContentRequest request, @RequestPart("file") MultipartFile file) throws IOException {
        PublishContentResponse response = myService.publishContent(request, file);
        return response;
    }
}

我的Servlet初始化程序:

    public class MyServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MyConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/mypath/*"};
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setMultipartConfig(getMultipartConfigElement());
    }

    private MultipartConfigElement getMultipartConfigElement() {
        loadServletProperties();
        MultipartConfigElement multipartConfigElement = new MultipartConfigElement("c:/temp/", 5242880, 20971520, 0);
        return multipartConfigElement;
    }
}

我的配置:

@Configuration
@ComponentScan
@EnableWebMvc
public class MyConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

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

  }

我的问题是servlet初始化程序(C:/ temp /)中定义的临时位置包含.tmp文件夹,这些文件夹是在每次请求此服务后创建的,永远不会被删除。在记事本中打开它们看起来它们只包含请求中发送的JSON的纯文本副本,而不包含上载文件的字节。我不能为我的生活弄清楚如何让这些文件在处理后消失。现在我已经使用了 每次调用后FileUtils.cleanDirectory(“C /:temp /”)但我对此解决方案并不满意。有没有人知道我可以做些什么来删除这些.tmp文件?

1 个答案:

答案 0 :(得分:2)

我终于发现,无论出于什么原因,JVM都不是垃圾收集,所以.tmp文件永远存在。虽然一个非常不满意的解决方案我能够通过强烈建议JVM在文件上传结束时进行垃圾收集来解决这个问题

System.gc();

最好还是找到一个原因,为什么它不是垃圾收集,但我现在放弃了这个!