2015-04-28 7 views
11

Używam Spring Boot i muszę umożliwić użytkownikom przesyłanie plików do przetworzenia. W tej chwili plik ładuje się do/home/username/git/myproject, co nie jest świetne.W jaki sposób określić katalog tymczasowy do przesyłania plików w Spring Boot?

W jaki sposób sprawić, aby Spring przesłała te pliki do katalogu tymczasowego, który będzie okresowo czyszczony przez restart aplikacji (lub w inny sposób)?

Oto, co próbowałem ... ale to nie działa. Plik nadal zapisuje się w moim katalogu roboczym.

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 Po prostu uruchomię swoją aplikację, uruchamiając Aplikację i korzysta z wbudowanego Tomcat.

UPDATE:

Ok mam to załatwić. Byłem przekształcania przychodzącego MultipartFile do normalnego pliku tak:

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

Zamiast tego powinny zostać tworzenia nowego pliku w wyznaczonym katalogu tymczasowego takiego:

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

Teraz można się z prośbą , "A co z ustawieniem" multipart.location "pliku application.properties?" To ustawienie, oczywiste z perspektywy czasu, steruje tylko tam, gdzie idzie efemeryczny plik wieloczęściowy. Jeśli wyświetli się watch that directory with a script, pojawi się krótko plik "upload_.tmp", a następnie znika. "multipart.location" nie ma nic wspólnego z trwałymi obiektami File, które możesz utworzyć.

(uwaga, może być w stanie korzystać z MultipartBean snippet z góry zamiast application.properties, ale nie spróbować i dlaczego chcesz?)

Aby zmienić wartość twoja prawdziwa katalog tymczasowy, możesz użyć argumentu "VM" -Djava.io.tmp =/path/to/dir, aby określić, co chcesz, przed uruchomieniem aplikacji Spring Boot.

Odpowiedz

9

Ponieważ używasz Spring Boot, łatwiej jest użyć MultipartProperties w Twoim pliku application.properties.

Od documentation właściwości np:

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

Również można przeczytać szczegółowy opis z MultipartProperties.

Aby skonfigurować do TMPDIR systemu, można ustawić:

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

multipart.enabled wydaje się być nieprawidłowy. Myślę, że mam jednak większe pytanie, które rozwiązałem i zamieszczę powyżej. – fivedogit

11

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

będzie ok.

0

Jeśli ktoś wciąż szuka programowej konfiguracji:

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

} 
Powiązane problemy