web-dev-qa-db-fra.com

Comment spécifier un répertoire temporaire pour les téléchargements de fichiers dans Spring Boot?

J'utilise Spring Boot et je dois laisser les utilisateurs télécharger des fichiers pour les traiter. À l'heure actuelle, le fichier est chargé dans/home/nom d'utilisateur/git/myproject, ce qui n'est pas génial.

Comment faire pour que Spring mette ces téléchargements de fichiers dans un répertoire temporaire qui sera périodiquement purgé par le redémarrage de l'application (ou par un autre moyen)? 

Voici ce que j'ai essayé ... mais ça ne marche pas. Le fichier est toujours enregistré dans mon répertoire de travail.

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 Je ne fais que lancer mon application en exécutant Application qui utilise Tomcat intégré.

METTRE À JOUR:

Ok j'ai tout réglé. Je convertissais le MultipartFile entrant en un fichier normal comme ceci:

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

Au lieu de cela, j'aurais dû créer un nouveau fichier dans le répertoire temporaire désigné, comme ceci:

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

Maintenant, vous vous demandez peut-être: "Qu'en est-il du paramètre 'multipart.location' du fichier application.properties?" Ce paramètre, évident après coup, ne contrôle que l’emplacement du fichier multipart éphémère. Si vous regardez ce répertoire avec un script , vous verrez qu'un fichier 'upload_.tmp' apparaît brièvement, puis disparaît. 'multipart.location' n'a rien à voir avec les objets File persistants que vous pourriez créer. 

(Notez que vous pourrez peut-être utiliser l'extrait de code MultipartBean ci-dessus au lieu de application.properties, mais je ne l'ai pas essayé et pourquoi voudriez-vous le faire?)

Pour changer la valeur de votre vrai répertoire temporaire, vous pouvez utiliser l'argument "-Djava.io.tmp =/path/to/dir" VM pour spécifier vos choix avant d'exécuter votre application Spring Boot.

15
fivedogit

en botte de printemps 1.4.1.LELEASE

spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB
spring.http.multipart.enabled=true
spring.http.multipart.location= ..

sera OK.

17
Qy Zuo

Puisque vous utilisez Spring Boot, il est plus facile d'utiliser la variable MultipartProperties dans votre fichier application.properties.

From documentation properties exemple:

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

Vous pouvez aussi lire une description détaillée dans MultipartProperties .

Afin de configurer votre système tmpdir, vous pouvez définir:

multipart.location=${Java.io.tmpdir}
13
Leandro Carracedo

Si quelqu'un recherche encore une configuration par programme:

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

}
1
igor.zh