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

时间:2014-01-14 20:33:33

标签: apache spring-mvc dropbox static-content spring-boot

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

的静态内容
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",

但当然我的Dropbox目录不在类路径上。

虽然我可以配置Apache来提供Dropbox文件夹中的图像,但我希望利用Spring Security来限制静态内容对经过身份验证的用户的访问。

12 个答案:

答案 0 :(得分:61)

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

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

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

此外,自春季启动1.2(我认为),您只需设置spring.resources.staticLocations

答案 1 :(得分:31)

Springboot(通过Spring)现在可以轻松地添加到现有资源处理程序。见Dave Syers answer。要添加到现有的静态资源处理程序,只需确保使用不覆盖现有路径的资源处理程序路径。

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

。 。

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

如果你想扩展默认的静态资源处理程序,那么这样的东西似乎有效:

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

答案 2 :(得分:19)

根据@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/

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

答案 3 :(得分:7)

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

答案 4 :(得分:3)

@MarkSchäfer

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

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

现在可以访问http://<host>/index.html

答案 5 :(得分:2)

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

}

}

答案 6 :(得分:1)

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

spring.resources.static-locations

<强>更新 我配置了

`spring.resources.static-位置=文件中:/ opt / X / Y / Z / static``

并希望在调用

时让我的index.html生活在此文件夹中

http://<host>/index.html

这不起作用。我必须在URL中包含文件夹名称

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

答案 7 :(得分:1)

从文件系统提供服务

我在spring.resources.static-location=file:../frontend/build

中添加了application.properties

index.html出现在build文件夹

使用也可以添加绝对路径

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

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

请注意,WebMvcConfigurerAdapter现已弃用(请参阅WebMvcConfigurerAdapter)。由于Java 8默认方法,您只需实现WebMvcConfigurer

答案 10 :(得分:0)

  • 操作系统:Win 10
  • Spring Boot: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 Appendix A中找到了该属性的原始值

这将使c:/images/image.jpg可以以http://localhost:8080/image.jpg的方式访问

答案 11 :(得分:0)

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

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

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

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

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