如何在Spring Boot中为文件上载指定临时目录?

时间:2015-04-28 15:33:21

标签: spring spring-mvc spring-boot

我使用Spring Boot,需要让用户上传文件进行处理。现在,文件上传到/ home / username / git / myproject,这不是很好。

如何让Spring将这些文件上传到一个临时目录中,该目录将通过应用程序重启(或其他方式)定期清除?

这是我尝试过的......但它不起作用。文件仍保存到我的工作目录。

public class Application implements CommandLineRunner {

    /*
     * This doesn't seem to work.
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize("128KB");
        factory.setMaxRequestSize("128KB");
        factory.setLocation(System.getProperty("java.io.tmpdir"));
        return factory.createMultipartConfig();
    }

/* other stuff, main(), etc */

}

PS我只是通过执行应用程序来运行我的应用程序,并使用嵌入式Tomcat。

更新

好的我已整理好了。我正在将传入的MultipartFile转换为普通文件,如下所示:

private File convertMultipartFileToFile(MultipartFile file) throws IOException
    {    
        File convFile = new File(file.getOriginalFilename());
        convFile.createNewFile(); 
        FileOutputStream fos = new FileOutputStream(convFile); 
        fos.write(file.getBytes());
        fos.close(); 
        return convFile;
    }

相反,我应该在指定的临时目录中创建一个新文件,如下所示:

private File convertMultipartFileToFile(MultipartFile file) throws IOException
    {    
        File convFile = File.createTempFile("temp", ".xlsx"); // choose your own extension I guess? Filename accessible with convFile.getAbsolutePath()
        FileOutputStream fos = new FileOutputStream(convFile); 
        fos.write(file.getBytes());
        fos.close(); 
        return convFile;
    }

现在你可能会问,"那么' multipart.location'设置application.properties文件?"回想起来,这个设置只能控制短暂的多部分文件的位置。如果您watch that directory with a script,您会看到' upload_.tmp'文件短暂出现然后消失。 ' multipart.location'与您可能创建的任何持久性File对象无关。

(注意,您可以使用上面的MultipartBean代码段而不是application.properties,但我没有尝试过,为什么要这样做?)

要更改真实临时目录的值,可以使用" -Djava.io.tmp = / path / to / dir" VM参数,用于在运行Spring Boot应用程序之前指定所需的任何内容。

4 个答案:

答案 0 :(得分:17)

在springboot 1.4.1.RELEASE

spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB
spring.http.multipart.enabled=true
spring.http.multipart.location= ..

没问题。

答案 1 :(得分:15)

由于您使用的是Spring Boot,因此您可以更轻松地使用MultipartProperties文件中的application.properties

来自documentation属性示例:

# MULTIPART (MultipartProperties)
multipart.enabled=true
multipart.file-size-threshold=0 # Threshold after which files will be written to disk.
multipart.location= # Intermediate location of uploaded files.
multipart.max-file-size=1Mb # Max file size.
multipart.max-request-size=10Mb # Max request size.

您也可以阅读MultipartProperties中的详细说明。

要配置系统tmpdir,您可以设置:

multipart.location=${java.io.tmpdir}

答案 2 :(得分:1)

如果有人还在寻找程序化配置:

@Configuration
public class ServletConfig {

  @Bean
  public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
    final ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
    final String location = System.getProperty("java.io.tmpdir");
    final long maxFileSize = 128*1024;
    final long maxRequestSize = 128*1024;
    final MultipartConfigElement multipartConfig  = new MultipartConfigElement(location, maxFileSize, maxRequestSize, 0);
    registration.setMultipartConfig(multipartConfig);
    return registration;
  }

}

答案 3 :(得分:0)

在Windows和Linux上,temp目录可能带有斜线。 多部分保存的tmp文件导致新文件名。创建我自己的tmp目录可以解决该问题。

    String tempDir = System.getProperty("java.io.tmpdir");
    if(  !tempDir.endsWith("/") && !tempDir.endsWith( "\\") ) {
        tempDir = tempDir+"/";