.tmp 文件未在 Multipart Spring MVC 文件上传中删除
.tmp files not being deleted in Multipart Spring MVC File Upload
我已经实现了一个 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 文件?
我终于发现,无论出于何种原因,JVM 都没有对其进行垃圾回收,因此 .tmp 文件将永远存在。虽然这是一个非常不令人满意的解决方案,但我能够通过强烈建议 JVM 在文件上传结束时使用
进行垃圾收集来解决这个问题
System.gc();
最好还是找到它最初不是垃圾收集的原因,但我现在放弃了!
我已经实现了一个 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 文件?
我终于发现,无论出于何种原因,JVM 都没有对其进行垃圾回收,因此 .tmp 文件将永远存在。虽然这是一个非常不令人满意的解决方案,但我能够通过强烈建议 JVM 在文件上传结束时使用
进行垃圾收集来解决这个问题System.gc();
最好还是找到它最初不是垃圾收集的原因,但我现在放弃了!