wake-up-neo.net

Wie verwende ich Spring Boot, um statischen Inhalt im Dropbox-Ordner bereitzustellen?

Ich habe eine Spring Boot-Webanwendung und möchte statischen Inhalt in einem freigegebenen Dropbox-Verzeichnis auf meinem Linode VPS (~/Dropbox/images) bereitstellen. Ich habe gelesen, dass Spring Boot automatisch statischen Inhalt ausliefert

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

aber mein Dropbox-Verzeichnis befindet sich natürlich nicht im Klassenpfad.

Obwohl ich Apache so konfigurieren könnte, dass die Bilder in meinem Dropbox-Ordner bereitgestellt werden, möchte ich Spring Security nutzen, um den Zugriff auf den statischen Inhalt auf authentifizierte Benutzer zu beschränken.

60

Sie können Ihren eigenen statischen Ressourcenhandler hinzufügen (der den Standard überschreibt), z.

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

In Spring Boot gibt es eine Dokumentation dazu, aber es ist wirklich nur eine Vanilla Spring MVC-Funktion.

Auch seit Spring Boot 1.2 (glaube ich) kann man einfach spring.resources.staticLocations.

65
Dave Syer

Springboot (über Spring) vereinfacht jetzt das Hinzufügen zu vorhandenen Ressourcen-Handlern. Siehe Antwort von Dave Syers . Stellen Sie zum Hinzufügen zu den vorhandenen statischen Ressourcenhandlern einfach sicher, dass Sie einen Ressourcenhandlerpfad verwenden, der vorhandene Pfade nicht überschreibt.

Die beiden folgenden "auch" -Notizen sind weiterhin gültig.

. . .

[Bearbeiten: Der unten stehende Ansatz ist nicht mehr gültig]

Wenn Sie extend die standardmäßigen statischen Ressourcen-Handler verwenden möchten, scheint Folgendes zu funktionieren:

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

}

Der Aufruf an super.addResourceHandlers richtet die Standardhandler ein.

Ebenfalls:

  • Beachten Sie den abschließenden Schrägstrich im Pfad der externen Datei. (Hängt von Ihrer Erwartung an URL-Zuordnungen ab.).
  • Prüfen Sie den Quellcode von WebMvcAutoConfigurationAdapter .
31
kaliatech

Basierend auf der Antwort von @ Dave Syers füge ich meinem Spring Boot-Projekt die folgende Klasse hinzu:

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

Dadurch kann ich meine Springboot-App mit dem Parameter --static.path Wie starten

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

Dies kann beim Entwickeln und Testen sehr nützlich sein.

19
asmaier

Es gibt eine Eigenschaft spring.resources.staticLocations, Die in application.properties Festgelegt werden kann. Beachten Sie, dass dadurch die Standardspeicherorte überschrieben werden. Siehe org.springframework.boot.autoconfigure.web.ResourceProperties.

7
Abhijit Sarkar

Basierend auf den Antworten von @ Dave Syer, @ Kaliatech und @ Plasmaier wäre der Springboot v2 + wie folgt:

@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

Niemals zu spät, aber mit einem Schrägstrich versehen (/) nach statisch:

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

So http://<Host>/index.html ist jetzt erreichbar.

3
JC Remy

Für die aktuelle Spring-Boot-Version 1.5.3 lautet der Parameter

spring.resources.static-locations

pdate Ich habe konfiguriert

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

und erwartet, dass meine index.html in diesem Ordner lebt, wenn ich anrufe

http://<Host>/index.html

Das hat nicht geklappt. Ich musste den Ordnernamen in die URL einfügen:

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

1
Mark Schäfer
  • OS: Win 10
  • Spring Boot: 2.1.2

Ich wollte statische Inhalte aus c:/images bereitstellen

Das Hinzufügen dieser Eigenschaft hat für mich funktioniert:

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

Den ursprünglichen Wert der Eigenschaft habe ich im Spring Boot Doc Anhang A gefunden

Dadurch kann c: /images/image.jpg als http: // localhost: 8080/image.jpg aufgerufen werden

1

Aus dem Dateisystem zu bedienen

Ich fügte hinzu spring.resources.static-location=file:../frontend/build im application.properties

index.html ist im Ordner build vorhanden

Verwendung kann auch absoluten Pfad hinzufügen

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

Ich denke, ähnlich können Sie versuchen, Dropbox-Ordnerpfad hinzuzufügen.

1
LAXIT KUMAR

Beachten Sie, dass WebMvcConfigurerAdapter jetzt veraltet ist (siehe WebMvcConfigurerAdapter ). Aufgrund von Java 8 Standardmethoden müssen Sie nur WebMvcConfigurer implementieren.

1
coseos

FWIW, ich hatte keinen Erfolg mit dem spring.resources.static-locations oben empfohlen; was bei mir funktioniert hat war spring.thymeleaf.prefix zu setzen:

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