我正在使用 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’ 设置呢?”回想起来,该设置仅控制临时多部分文件的去向。如果您 使用脚本查看该目录,您会看到“upload_.tmp”文件短暂出现然后消失。 “multipart.location”与您可能创建的任何持久文件对象无关。
(注意,您也许可以使用上面的 MultipartBean 片段而不是 application.properties,但我没有尝试过,您为什么要这样做?)
要更改您的真实临时目录的值,您可以在运行 Spring Boot 应用程序之前使用“-Djava.io.tmp=/path/to/dir”VM 参数来指定您想要的任何内容。
原文由 fivedogit 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 springboot 1.4.1.RELEASE
会好的。