web-dev-qa-db-ja.com

Spring Bootを使用して、Dropboxフォルダーにある静的コンテンツを提供するにはどうすればよいですか?

Spring Boot Webアプリケーションがあり、Linode VPSの共有Dropboxディレクトリ(〜/ Dropbox/images)にある静的コンテンツを提供したいと思います。私はSpring Bootが静的コンテンツを自動的に提供することを読んだことがあります

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

もちろん、私のDropboxディレクトリはクラスパス上にありません。

Dropboxフォルダー内の画像を提供するようにApacheを構成できましたが、Spring Securityを利用して、静的コンテンツへのアクセスを認証されたユーザーに制限したいと思います。

60

独自の静的リソースハンドラーを追加できます(デフォルトを上書きします)。

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

これについてのドキュメントは Spring Boot にありますが、実際には単なるVanilla Spring MVC機能です。

また、スプリングブート1.2(と思う)からspring.resources.staticLocationsを設定することもできます。

65
Dave Syer

Springboot(Spring経由)により、既存のリソースハンドラーへの追加が簡単になりました。 Dave Syers answer を参照してください。既存の静的リソースハンドラーに追加するには、単に既存のパスをオーバーライドしないリソースハンドラーパスを使用してください。

以下の2つの「また」の注意事項は引き続き有効です。

。 。 。

[編集:以下のアプローチはもはや有効ではありません]

デフォルトの静的リソースハンドラをextendしたい場合は、次のように動作するようです。

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

}

super.addResourceHandlersを呼び出すと、デフォルトのハンドラーが設定されます。

また:

  • 外部ファイルパスの末尾のスラッシュに注意してください。 (URLマッピングに対する期待に依存します)。
  • WebMvcAutoConfigurationAdapter のソースコードを確認することを検討してください。
31
kaliatech

@Dave Syersの回答に基づいて、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");
 }
}

これにより、--static.pathのようなパラメーターでスプリングブートアプリを起動できます

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

これは、開発とテストに非常に便利です。

19
asmaier

spring.resources.staticLocationsで設定できるプロパティapplication.propertiesがあります。これはデフォルトの場所を上書きすることに注意してください。 org.springframework.boot.autoconfigure.web.ResourcePropertiesを参照してください。

7
Abhijit Sarkar

@Dave Syer、@ kaliatechおよび@asmaierに基づくと、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);

  }

}
3
s.ijpma

@マーク・シェーファー

遅すぎることはありませんが、静的の後にスラッシュ(/)を追加します。

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

http://<Host>/index.htmlに到達できるようになりました。

3
JC Remy

現在のSpring-Bootバージョン1.5.3では、パラメーターは

spring.resources.static-locations

更新設定済み

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

を呼び出すと、このフォルダにindex.htmlが住んでいると予想されます

http://<Host>/index.html

これは機能しませんでした。 URLにフォルダー名を含める必要がありました。

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

1
Mark Schäfer
  • OS:勝利10
  • スプリングブート:2.1.2

C:/ imagesから静的コンテンツを提供したかった

このプロパティを追加するとうまくいきました:

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

Spring Boot Docでプロパティの元の値を見つけました 付録A

これにより、c:/images/image.jpgが http:// localhost:8080/image.jpg としてアクセス可能になります。

1

ファイルシステムから提供するには

spring.resources.static-location=file:../frontend/buildapplication.propertiesを追加しました

index.htmlbuildフォルダーにあります

使用して絶対パスを追加することもできます

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

同様に、Dropboxフォルダーパスを追加してみることができると思います。

1
LAXIT KUMAR

WebMvcConfigurerAdapterは非推奨になっていることに注意してください( WebMvcConfigurerAdapter を参照)。 Java 8のデフォルトメソッドにより、 WebMvcConfigurer のみを実装する必要があります。

1
coseos

FWIW、私は上記で推奨されたspring.resources.static-locationsで成功しませんでした。私のために働いたのはspring.thymeleaf.prefixを設定することでした:

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