如何使用Spring Boot提供位于Dropbox文件夹中的静态内容?


70

我有一个Spring Boot Web应用程序,我想提供位于Linode VPS上共享的Dropbox目录中的静态内容(〜/ Dropbox / images)。我读过Spring Boot将自动从

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

但是我的Dropbox目录当然不在classpath上。

尽管我可以配置Apache来在我的Dropbox文件夹中提供图像,但是我想利用Spring Security将静态内容的访问限制为经过身份验证的用户。

Answers:


76

您可以添加自己的静态资源处理程序(它将覆盖默认值),例如

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

Spring Boot中有一些与此有关的文档,但这实际上只是一个普通的Spring MVC功能。

另外,从Spring Boot 1.2(我认为)开始,您可以简单地进行设置spring.resources.staticLocations


在上面的示例中,我找不到超类WebMvcAdapter。哪个Spring JAR包含该类?
香农·肯德里克

我改为扩展了WebMvcConfigurerAdapter。
香农·肯德里克

7
正如@kaliatech所提到的,不要忘记在Resource Location路径上的尾部斜杠。
1in9ui5t

1
要保留默认资源映射并在添加资源时添加dropbbox文件夹,建议重命名resourceHandler路径,例如:registry.addResourceHandler(“ / files / **”)。addResourceLocations(“ file:/ path / to / my / dropbox /”) ;
德米特里·斯托尔博夫

找不到页面链接。既然这是一个被接受的答案,而且票数很高,那么我是否可以建议对此进行更新?
PaulB

35

Springboot(通过Spring)现在使添加到现有资源处理程序变得容易。参见Dave Syers的答案。要添加到现有的静态资源处理程序中,只需确保使用不会覆盖现有路径的资源处理程序路径即可。

下面的两个“也”注释仍然有效。

。。。

[编辑:以下方法不再有效]

如果您想扩展默认的静态资源处理程序,那么类似的方法似乎可行:

@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的源代码。

太好了,谢谢!我还要提到,在资源处理程序映射中还必须包含尾随/ **,这一点很重要,我忘了添加,并且不断收到404错误
Trevor

该解决方案朝着正确的方向发展,但是由于构造函数参数并非全部公开,因此无法从WebMvcAutoConfigurationAdapter继承。
Geoffroy Warin

@GeoffroyWarin这个答案最初是为旧版本编写的。我刚刚对其进行了编辑以表明这一点。请参阅Dave Syer的答案。要添加到现有资源处理程序中,只需确保不覆盖现有资源路径即可。
kaliatech '17

20

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

这让我开始我的春天启动的应用程序与参数--static.path类似

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

这对于开发和测试非常方便。


8

@马克·谢弗

永远不会太晚,但是/在静态之后添加一个斜杠():

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

所以http://<host>/index.html现在可以到达。


8
  • 操作系统:Win 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访问


7

spring.resources.staticLocations可以在中设置一个属性application.properties。请注意,这将覆盖默认位置。请参阅org.springframework.boot.autoconfigure.web.ResourceProperties


6

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

  }

}

1
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)加上这个保存了我的一天。谢谢
exexzian

2

从文件系统服务

我加入spring.resources.static-location=file:../frontend/buildapplication.properties

index.htmlbuild文件夹中

使用还可以添加绝对路径

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

我认为您也可以尝试添加Dropbox文件夹路径。


1

对于当前的Spring-Boot版本1.5.3,参数为

spring.resources.static-locations

我配置的更新

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

并希望在调用时将我的index.html放在此文件夹中

http://<host>/index.html

这没有用。我必须在URL中包括文件夹名称

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


1

FWIW,我在spring.resources.static-locations上面的建议中没有取得任何成功;对我有用的是设置spring.thymeleaf.prefix:

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


0

您可以将文件夹放置在ServletContext的根目录中。

然后在application.yml中指定此目录的相对或绝对路径:

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

该文件夹中的资源可从以下位置获得(例如,用于下载):

http://<host>:<port>/<context>/your_file.csv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.