我使用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应用程序之前指定所需的任何内容。
答案 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+"/";