web-dev-qa-db-fra.com

Comment utiliser Spring Boot pour servir du contenu statique situé dans le dossier Dropbox?

J'ai une application Web Spring Boot et je souhaite diffuser du contenu statique situé dans un répertoire Dropbox partagé sur mon VPS Linode (~/Dropbox/images). J'ai lu que Spring Boot servira automatiquement le contenu statique de

"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",

mais bien sûr, mon répertoire Dropbox n'est pas sur le classpath.

Bien que je puisse configurer Apache pour servir les images dans mon dossier Dropbox, je voudrais profiter de Spring Security pour limiter l'accès du contenu statique aux utilisateurs authentifiés.

60
Shannon Kendrick

Vous pouvez ajouter votre propre gestionnaire de ressources statiques (il écrase les valeurs par défaut), par exemple.

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("file:/path/to/my/dropbox/");
    }
}

Il existe un peu de documentation à ce sujet dans Spring Boot , mais il s’agit en réalité d’une fonctionnalité MVC de Vanilla Spring.

En outre, depuis le démarrage de printemps 1.2 (je pense), vous pouvez simplement définir spring.resources.staticLocations.

65
Dave Syer

Springboot (via Spring) facilite désormais l’ajout aux gestionnaires de ressources existants. Voir Dave Syers answer . Pour ajouter aux gestionnaires de ressources statiques existants, veillez simplement à utiliser un chemin de gestionnaire de ressources qui ne remplace pas les chemins existants.

Les deux notes "aussi" ci-dessous sont toujours valables.

. . .

[Modifier: l'approche ci-dessous n'est plus valable]

Si vous voulez étendre les gestionnaires de ressources statiques par défaut, quelque chose comme cela semble fonctionner:

@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class CustomWebMvcAutoConfig extends
                    WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    String myExternalFilePath = "file:///C:/Temp/whatever/m/";

    registry.addResourceHandler("/m/**").addResourceLocations(myExternalFilePath);

    super.addResourceHandlers(registry);
  }

}

L'appel à super.addResourceHandlers configure les gestionnaires par défaut.

Aussi:

  • Notez la barre oblique de fin sur le chemin du fichier externe. (Dépend de vos attentes pour les mappages d'URL).
  • Envisagez de passer en revue le code source de WebMvcAutoConfigurationAdapter .
31
kaliatech

Basé sur @Dave Syers answer, j'ajoute la classe suivante à mon projet Spring Boot:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {

 private static final Logger LOG = LoggerFactory.getLogger(StaticResourceConfiguration.class);

 @Value("${static.path}")
 private String staticPath;

 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {

    if(staticPath != null) {
        LOG.info("Serving static content from " + staticPath);
        registry.addResourceHandler("/**").addResourceLocations("file:" + staticPath);
    }
 }

 // see https://stackoverflow.com/questions/27381781/Java-spring-boot-how-to-map-my-my-app-root-to-index-html
 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("redirect:/index.html");
 }
}

Cela me permet de démarrer mon application de démarrage de printemps avec le paramètre --static.path comme

Java -jar spring-app-1.0-SNAPSHOT.jar --static.path=/path/to/my/static-files/

Cela peut être très utile pour le développement et les tests.

19
asmaier

Il y a une propriété spring.resources.staticLocations qui peut être défini dans le application.properties. Notez que cela remplacera les emplacements par défaut. Voir org.springframework.boot.autoconfigure.web.ResourceProperties.

7
Abhijit Sarkar

Basé sur @Dave Syer, @kaliatech et @asmaier répondent que la méthode springboot v2 + serait:

@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class StaticResourceConfiguration implements WebMvcConfigurer  {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    String myExternalFilePath = "file:///C:/temp/whatever/m/";

     registry.addResourceHandler("/m/**").addResourceLocations(myExternalFilePath);

  }

}
3
s.ijpma

@ Mark Schäfer

Jamais trop tard, mais ajoutez une barre oblique (/) après statique:

spring.resources.static-locations=file:/opt/x/y/z/static/

Alors http://<Host>/index.html est maintenant accessible.

3
JC Remy

Pour la version actuelle de Spring-Boot 1.5.3, le paramètre est

spring.resources.static-locations

Mise à jour J'ai configuré

`spring.resources.static-locations = fichier:/opt/x/y/z/statique``

et espère obtenir mon index.html vivant dans ce dossier lors de l'appel

http://<Host>/index.html

Cela n'a pas fonctionné. Je devais inclure le nom du dossier dans l'URL:

http://<Host>/static/index.html

1
Mark Schäfer
  • OS: Win 10
  • Botte de printemps: 2.1.2

Je voulais servir du contenu statique à partir de c:/images

Ajouter cette propriété a fonctionné pour moi:

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:///C:/images/

J'ai trouvé la valeur d'origine de la propriété dans le document Spring Boot Doc Annexe A

Cela rendra c: /images/image.jpg accessible en tant que http: // localhost: 8080/image.jpg

1
Igor Stojanovski

Servir depuis un système de fichiers

J'ai ajouté spring.resources.static-location=file:../frontend/build dans application.properties

index.html est présent dans le dossier build

Utilisation peut également ajouter un chemin absolu

spring.resources.static-location=file:/User/XYZ/Desktop/frontend/build

Je pense que de même, vous pouvez essayer d'ajouter le chemin du dossier Dropbox.

1
LAXIT KUMAR

Notez que WebMvcConfigurerAdapter est maintenant obsolète (voir WebMvcConfigurerAdapter ). En raison de Java 8 méthodes par défaut, il vous suffit de mettre en œuvre WebMvcConfigurer .

1
coseos

FWIW, je n’ai eu aucun succès avec le spring.resources.static-locations recommandé ci-dessus; ce qui a fonctionné pour moi, c’était de mettre spring.thymeleaf.prefix:

report.location=file:/Users/bill/report/html/
spring.thymeleaf.prefix=${report.location}
1
Bill Horvath