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

fiv*_*git 18 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 */

}
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

现在您可能会问,"那么application.properties文件的'multipart.location'设置呢?" 回想起来,这个设置只能控制短暂的多部分文件的位置.如果您使用脚本观察该目录,您将看到"upload_.tmp"文件短暂出现然后消失.'multipart.location'与您可能创建的任何持久性File对象无关.

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

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

Qy *_*Zuo 20

在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= ..
Run Code Online (Sandbox Code Playgroud)

会好的.


Lea*_*edo 16

由于您使用的是Spring Boot,因此MultipartPropertiesapplication.properties文件中使用它更容易.

文档属性示例:

# 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.
Run Code Online (Sandbox Code Playgroud)

您还可以从MultipartProperties中读取详细说明.

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

multipart.location=${java.io.tmpdir}
Run Code Online (Sandbox Code Playgroud)

  • 对于此线程 + Spring 文档的评论,配置有三种风格:“spring.http.multipart.location”、“multipart.location”和“spring.servlet.multipart.location”。它们为何以及如何不同? (3认同)