Como uso o Spring Boot para servir conteúdo estático localizado na pasta Dropbox?

Eu tenho um aplicativo web Spring Boot, e gostaria de servir conteúdo estático localizado em um diretório Dropbox compartilhado no meu Linode VPS (~ / Dropbox / images). Eu li que o Spring Boot servirá automaticamente conteúdo estático de

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

mas é claro que meu diretório do Dropbox não está no classpath.

Embora eu pudesse configurar o Apache para exibir as imagens na minha pasta do Dropbox, gostaria de aproveitar o Spring Security para restringir o access do conteúdo estático a usuários autenticados.

Você pode adicionar seu próprio manipulador de resources estáticos (ele substitui o padrão), por exemplo

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

Há alguma documentação sobre isso no Spring Boot , mas é realmente apenas um recurso do Spring MVC.

Também desde a boot da mola 1.2 (eu acho) você pode simplesmente definir spring.resources.staticLocations .

O Springboot (via Spring) agora facilita a adição aos manipuladores de resources existentes. Veja a resposta de Dave Syers . Para adicionar aos manipuladores de resources estáticos existentes, simplesmente use um caminho do manipulador de resources que não substitua os caminhos existentes.

As duas notas “também” abaixo ainda são válidas.

. . .

[Edit: A abordagem abaixo não é mais válida]

Se você deseja estender os manipuladores de resources estáticos padrão, algo como isto parece funcionar:

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

A chamada para super.addResourceHandlers configura os manipuladores padrão.

Além disso:

  • Observe a barra final no caminho do arquivo externo. (Depende da sua expectativa para mapeamentos de URL).
  • Considere revisar o código-fonte do WebMvcAutoConfigurationAdapter .

Com base na resposta do @Dave Syers, adiciono a seguinte class ao meu projeto 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"); } } 

Isso me permite iniciar o meu aplicativo de boot de mola com o parâmetro --static.path como

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

Isso pode ser muito útil para desenvolvimento e teste.

Há uma propriedade spring.resources.staticLocations que pode ser configurada no application.properties . Observe que isso replaceá os locais padrão. Veja org.springframework.boot.autoconfigure.web.ResourceProperties .

Para o atual Spring-Boot Versão 1.5.3, o parâmetro é

spring.resources.static-locations

Atualizar eu configurei

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

e esperado para obter o meu index.html vivendo nesta pasta ao chamar

http:///index.html

Isso não funcionou. Eu tive que include o nome da pasta no URL:

http:///static/index.html

@ Mark Schäfer

Nunca é tarde demais, mas adicione uma barra ( / ) depois da estática:

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

Então, o http:///index.html está agora acessível.

Para servir a partir do sistema de arquivos

Eu adicionei spring.resources.static-location=file:../frontend/build em application.properties

index.html está presente na pasta de build

Use também pode adicionar caminho absoluto

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

Eu acho que da mesma forma você pode tentar adicionar o caminho da pasta Dropbox.

FWIW, eu não tive nenhum sucesso com os spring.resources.static-locations recomendados acima; o que funcionou para mim foi definir spring.thymeleaf.prefix:

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

Observe que o WebMvcConfigurerAdapter está obsoleto agora (consulte WebMvcConfigurerAdapter ). Devido aos methods padrão do Java 8, você só precisa implementar o WebMvcConfigurer .