Wie verwende ich Spring Boot, um statische Inhalte im Dropbox-Ordner bereitzustellen?

70

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

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

Aber natürlich befindet sich mein Dropbox-Verzeichnis 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.

Shannon Kendrick
quelle

Antworten:

76

Sie können Ihren eigenen statischen Ressourcenhandler hinzufügen (der Standard wird überschrieben), z

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

Es gibt einige Dokumentationen dazu in Spring Boot , aber es ist wirklich nur eine Vanilla Spring MVC-Funktion.

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

Dave Syer
quelle
Ich finde den WebMvcAdapter der Superklasse in Ihrem obigen Beispiel nicht. Welches Spring JAR enthält diese Klasse?
Shannon Kendrick
Ich habe stattdessen WebMvcConfigurerAdapter erweitert.
Shannon Kendrick
7
Vergessen Sie nicht, wie @kaliatech erwähnt hat, den abschließenden Schrägstrich im Pfad für den Ressourcenstandort.
1in9ui5t
1
Um die Standardressourcenzuordnung zu belassen und den Dropbbox-Ordner als Zusatzressourcen hinzuzufügen, wird empfohlen, den Pfad resourceHandler umzubenennen. Beispiel: registry.addResourceHandler ("/ files / **"). AddResourceLocations ("Datei: / path / to / my / dropbox /") ;;
Dmitry Stolbov
Link für Seite nicht gefunden. Da dies die akzeptierte Antwort mit einer erheblichen Anzahl von Stimmen ist, kann ich eine Aktualisierung vorschlagen?
PaulB
35

Springboot (über Spring) erleichtert jetzt das Hinzufügen zu vorhandenen Ressourcenhandlern. Siehe Dave Syers Antwort . Verwenden Sie zum Hinzufügen zu den vorhandenen statischen Ressourcenhandlern einfach einen Ressourcenhandlerpfad, der vorhandene Pfade nicht überschreibt.

Die beiden folgenden "auch" Hinweise sind weiterhin gültig.

. . .

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

Wenn Sie die Standardhandler für statische Ressourcen erweitern 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 zum super.addResourceHandlersEinrichten der Standardhandler.

Ebenfalls:

  • Beachten Sie den abschließenden Schrägstrich im externen Dateipfad. (Hängt von Ihrer Erwartung für URL-Zuordnungen ab).
  • Überprüfen Sie den Quellcode von WebMvcAutoConfigurationAdapter .
Kaliatech
quelle
Super, danke dafür! Ich würde auch erwähnen, dass es wichtig ist, das nachgestellte / ** auch in die Ressourcenhandlerzuordnung aufzunehmen. Ich habe vergessen, das hinzuzufügen, und ich habe immer wieder 404 Fehler erhalten
Trevor
Diese Lösung geht in die richtige Richtung, es ist jedoch nicht möglich, von WebMvcAutoConfigurationAdapter zu erben, da die Konstruktorargumente nicht alle öffentlich sind.
Geoffroy Warin
@GeoffroyWarin Diese Antwort wurde ursprünglich für ältere Versionen geschrieben. Ich habe es gerade bearbeitet, um das anzuzeigen. Siehe Dave Syers Antwort. Stellen Sie zum Hinzufügen zu vorhandenen Ressourcenhandlern einfach sicher, dass vorhandene Ressourcenpfade nicht überschrieben werden.
Kaliatech
20

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 /programming/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 Spring Boot App mit dem Parameter --static.pathlike starten

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

Dies kann sehr praktisch für die Entwicklung und das Testen sein.

Asmaier
quelle
8

@ Mark Schäfer

Nie zu spät, aber /nach statischer Aufladung einen Schrägstrich ( ) hinzufügen :

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

So http://<host>/index.htmlist jetzt erreichbar.

JC Remy
quelle
8
  • Betriebssystem: Win 10
  • Spring Boot: 2.1.2

Ich wollte statische Inhalte aus c: / images bereitstellen

Das Hinzufügen dieser Eigenschaft hat bei mir funktioniert:

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

Ich habe den ursprünglichen Wert der Eigenschaft im Spring Boot Doc Anhang A gefunden

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

Igorski
quelle
7

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

Abhijit Sarkar
quelle
6

Basierend auf den Antworten von @Dave Syer, @kaliatech und @asmaier lautet der Weg für springboot v2 +:

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

  }

}
s.ijpma
quelle
1
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)Das Hinzufügen rettete meinen Tag. Danke
Exexzian
2

Vom Dateisystem aus bedienen

Ich habe spring.resources.static-location=file:../frontend/buildinapplication.properties

index.htmlist im buildOrdner vorhanden

Verwendung kann auch absoluten Pfad hinzufügen

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

Ich denke, in ähnlicher Weise können Sie versuchen, den Dropbox-Ordnerpfad hinzuzufügen.

LAXIT KUMAR
quelle
1

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

spring.resources.static-locations

Update habe ich konfiguriert

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

und erwartet, dass meine index.html beim Aufruf in diesem Ordner lebt

http://<host>/index.html

Das hat nicht funktioniert. Ich musste den Ordnernamen in die URL aufnehmen:

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

Mark Schäfer
quelle
1

FWIW, ich hatte keinen Erfolg mit den spring.resources.static-locationsoben empfohlenen; Was für mich funktioniert hat, war das Setzen von spring.thymeleaf.prefix:

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

Sie können Ihren Ordner im Stammverzeichnis des ServletContext ablegen.

Geben Sie dann in application.yml einen relativen oder absoluten Pfad zu diesem Verzeichnis an:

spring:
  resources:
    static-locations: file:some_temp_files/

Die Ressourcen in diesem Ordner sind verfügbar (zum Beispiel zum Herunterladen) unter:

http://<host>:<port>/<context>/your_file.csv

quelle