Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does one specify a temp directory for file uploads in Spring Boot?

I'm using Spring Boot and need to let users upload files for processing. Right now, the file uploads to /home/username/git/myproject which is not great.

How do I make Spring put those file uploads into a temporary directory that will be periodically purged by application restart (or some other means)?

Here's what I've tried... but it doesn't work. File still saves to my working directory.

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 I'm just running my app by executing Application and it's using embedded Tomcat.

UPDATE:

Ok I've got it sorted out. I was converting the incoming MultipartFile to a normal File like so:

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

Instead, I should have been creating a new File in the designated temporary directory like this:

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

Now you may be asking, "Well what about the 'multipart.location' setting of the application.properties file?" That setting, obvious in retrospect, controls only where the ephemeral multipart file goes. If you watch that directory with a script, you'll see that a 'upload_.tmp' file appears briefly and then disappears. 'multipart.location' has nothing to do with any persistent File objects you might create.

(Note, you may be able to use the MultipartBean snippet from above instead of application.properties, but I didn't try it and why would you want to?)

To change the value of your true temp directory, you can use "-Djava.io.tmp=/path/to/dir" VM argument to specify whatever you want before running your Spring Boot application.

like image 516
fivedogit Avatar asked Apr 28 '15 15:04

fivedogit


People also ask

How do I upload a file to spring boot?

Spring Boot file uploader Create a Spring @Controller class; Add a method to the controller class which takes Spring's MultipartFile as an argument; Save the uploaded file to a directory on the server; and. Send a response code to the client indicating the Spring file upload was successful.

Which of the following is the dependency that is needed to support uploading of a file in MVC?

The dependency needed for MVC is the spring-webmvc package. The javax. validation and the hibernate-validator packages will be also used here for validation. The commons-io and commons-fileupload packages are used for uploading the file.

How does MultipartFile work in spring?

The file contents are either stored in memory or temporarily on disk. In either case, the user is responsible for copying file contents to a session-level or persistent store as and if desired. The temporary storages will be cleared at the end of request processing.


1 Answers

in 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= .. 

will be ok.

like image 74
Qy Zuo Avatar answered Sep 21 '22 18:09

Qy Zuo