2015-04-28 33 views
11

Utilizzo Spring Boot e devo consentire agli utenti di caricare i file per l'elaborazione. In questo momento, il file viene caricato in/home/username/git/myproject che non è eccezionale.Come si può specificare una directory temporanea per i caricamenti di file in Spring Boot?

Come faccio a rendere Spring questi caricamenti di file in una directory temporanea che verrà periodicamente eliminata dal riavvio dell'applicazione (o altri mezzi)?

Ecco cosa ho provato ... ma non funziona. Il file viene comunque salvato nella mia directory di lavoro.

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 Sto solo eseguendo la mia app eseguendo Applicazione e sta utilizzando Tomcat incorporato.

UPDATE:

Ok li ho risolto. Stavo Conversione del MultipartFile in arrivo per un normale file in questo modo:

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

Invece, sarei stato la creazione di un nuovo file nella directory temporanea definita in questo modo:

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

Ora si può chiedere , "Beh, che dire dell'impostazione 'multipart.location' del file application.properties?" Quella impostazione, ovvia in retrospettiva, controlla solo dove va il file multipart effimero. Se hai watch that directory with a script, vedrai che un file 'upload_.tmp' appare brevemente e poi scompare. 'multipart.location' non ha nulla a che fare con gli oggetti File persistenti che potresti creare.

(Nota, si può essere in grado di utilizzare i MultipartBean snippet dall'alto invece di application.properties, ma non l'ho provato e perché si vorrebbe?)

Per modificare il valore del tuo vero directory temp, puoi usare l'argomento "-Djava.io.tmp =/path/to/dir" VM per specificare tutto ciò che vuoi prima di avviare la tua applicazione Spring Boot.

risposta

9

Poiché si utilizza Spring Boot, è più semplice utilizzare lonel file application.properties.

Da documentation proprietà esempio:

# 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. 

Inoltre si poteva leggere una descrizione dettagliata del MultipartProperties.

Per configurare al vostro tmpdir del sistema, è possibile impostare:

multipart.location=${java.io.tmpdir} 
+0

multipart.enabled sembra essere valido. Penso di aver risolto la domanda più ampia e pubblicherò sopra. – fivedogit

11

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

sarà ok.

0

Se qualcuno è ancora alla ricerca per la configurazione programmatica:

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

} 
Problemi correlati