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

标签 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;
    }

现在您可能会问,“那么 application.properties 文件的 'multipart.location' 设置怎么样?”回想起来,该设置仅控制临时多部分文件的去向。如果您 watch that directory with a script ,您会看到“upload_.tmp”文件短暂出现然后消失。 “multipart.location”与您可能创建的任何持久文件对象无关。

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

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

最佳答案

在 spring boot 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= ..

会好的。

关于spring - 如何在 Spring Boot 中为文件上传指定临时目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29923682/

相关文章:

spring - 在 Spring 拦截器中访问 session 范围变量

java - 将 AspectJ 与 iBatis、Spring 结合使用时不应用事务

spring - 双(调度程序)bean 初始化

java - OneToOne 和复合主键的 JPA 注释错误

java - 使用 Java Spring Boot,如何将依赖项、我的源代码和 Spring 合并到一个 Jar 文件中

jquery - Spring Security 3.1 - 发生 session 超时时自动重定向到登录页面

java - 从文件系统(重新)扫描 ​​Mybatis 映射器

Spring的ResponseBodyAdvice : Order of execution?

Spring 启动 : NoUniqueBeanDefinitionException between test and main

java - Dao实现中如何进行以下操作?