Как использовать Spring Boot для обслуживания статического содержимого, находящегося в папке Dropbox?
У меня есть веб-приложение Spring Boot, и я хотел бы показывать статический контент, расположенный в общем каталоге Dropbox на моем Linode VPS (~/Dropbox/images). Я читал, что Spring Boot автоматически будет загружать статический контент из
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",
но, конечно, мой каталог Dropbox не находится в пути к классам.
Хотя я мог настроить Apache для работы с изображениями в моей папке Dropbox, я хотел бы воспользоваться преимуществами Spring Security, чтобы ограничить доступ к статическому контенту для аутентифицированных пользователей.
Ответы
Ответ 1
Вы можете добавить свой собственный обработчик статических ресурсов (он перезаписывает по умолчанию), например
@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
.
Ответ 2
Springboot (через Spring) теперь упрощает добавление к существующим обработчикам ресурсов. См. ответ Дейва Сиерса. Чтобы добавить к существующим обработчикам статических ресурсов, просто не забудьте использовать путь обработчика ресурсов, который не переопределяет существующие пути.
Два примечания "еще" ниже остаются в силе.
.
,
.
[Изменить: приведенный ниже подход больше не действителен]
Если вы хотите расширить обработчики статических ресурсов по умолчанию, то похожее на это похоже:
@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.
Ответ 3
На основе ответа @Dave Syers добавьте следующий класс в мой проект загрузки Spring:
@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");
}
}
Это позволяет мне запустить мое загрузочное приложение Spring с параметром --static.path
как
java -jar spring-app-1.0-SNAPSHOT.jar --static.path=/path/to/my/static-files/
Это может быть очень удобно для разработки и тестирования.
Ответ 4
Здесь есть свойство spring.resources.staticLocations
, которое можно установить в application.properties
. Обратите внимание, что это переопределит местоположение по умолчанию. См. org.springframework.boot.autoconfigure.web.ResourceProperties
.
Ответ 5
@Марк Шефер
Никогда не поздно, но добавьте косую черту (/
) после статического:
spring.resources.static-locations=file:/opt/x/y/z/static/
Так что http://<host>/index.html
теперь доступен.
Ответ 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);
}
}
Ответ 7
Служить из файловой системы
Я добавил spring.resources.static-location=file:../frontend/build
в application.properties
index.html
присутствует в папке build
Использование также может добавить абсолютный путь
spring.resources.static-location=file: /User/XYZ/Desktop/frontend/build
Я думаю, что аналогичным образом вы можете попробовать добавить путь к папке Dropbox.
Ответ 8
Для текущей версии Spring -Boot версии 1.5.3 параметр
spring.resources.static-locations
Обновление
Я настроил
`spring.resources.static-локации = Файл:/OPT/х/у/г/static``
и ожидаем, что мой index.html будет жить в этой папке при вызове
http://<host>/index.html
Это не сработало. Мне нужно было указать имя папки в URL:
http://<host>/static/index.html
Ответ 9
FWIW, у меня не было никакого успеха с spring.resources.static-locations
рекомендованным выше; у меня работало то, что я установил spring.thymeleaf.prefix:
report.location=file:/Users/bill/report/html/
spring.thymeleaf.prefix=${report.location}
Ответ 10
Обратите внимание, что WebMvcConfigurerAdapter устарела (см. WebMvcConfigurerAdapter). Из-за методов Java 8 по умолчанию вам нужно только реализовать WebMvcConfigurer.
Ответ 11
- ОС: 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 A Boot Doc, Приложение A
Это сделает c: /images/image.jpg доступным как http://localhost: 8080/image.jpg
Ответ 12
Вы можете поместить свою папку в корень ServletContext.
Затем укажите относительный или абсолютный путь к этому каталогу в application.yml:
spring:
resources:
static-locations: file:some_temp_files/
Ресурсы в этой папке будут доступны (например, для загрузки) по адресу:
http://<host>:<port>/<context>/your_file.csv