Spring Отображение изображения, которое было загружено пользователем без перезагрузки сервера. - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь создать функцию, которая позволяет пользователю загружать свое изображение профиля, а затем он может отображать его при публикации или комментировании, я использую Spring mvc, Spring security, hibernate и tomcat 9.

Когда я добавляю изображение, которое недавно было загружено в корневой каталог проекта, и пытаюсь отобразить его на веб-сайте, я должен перезапустить его, чтобы оно могло работать.я не могу заставить сервер перезагружаться каждый раз, когда кто-то загружает его изображение профиля, чтобы отобразить его, есть ли что-то вроде слушателя, который сразу же увидел бы, что изображение было добавлено в корневой путь, и отобразил бы его при

<img src="${pageContext.request.contextPath}/static/images/basic-profile-pic.jpeg">

Я использую классы конфигурации Spring Java, и это мой класс конфигурации Spring MVC

@Configuration
@EnableWebMvc
@ComponentScan(basePackages =     
{"spring.ahmed.mostafa.data","com.ahmed.mostafa.controllers"})
  public class SpringWebConfig implements WebMvcConfigurer {

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/pages/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
@Bean
public MessageSource messageSource(){
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setBasename("messages");
    return source;
}

@Override
public Validator getValidator() {
    LocalValidatorFactoryBean validator= new LocalValidatorFactoryBean();
    validator.setValidationMessageSource(messageSource());
    return validator;
}

@Bean(name="multipartResolver")
public CommonsMultipartResolver getResolver() throws IOException {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setMaxUploadSizePerFile(5242880);//5MB
    return resolver;
}
}

Можно ли загрузить его и отобразить его без перезагрузки в корне или лучше не помещать его в корневой путь и измененияэто где-то еще, и как заставить это работать в любом случае

Спасибо!

1 Ответ

0 голосов
/ 03 июня 2018

Попробуйте Spring Content .Он обеспечивает простое хранение и поиск «контента», будь то изображения, видео, документы и т. Д.

Добавьте эти зависимости в ваш файл pom.xml:

    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-fs</artifactId>
        <version>0.0.11</version>
    </dependency>
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest</artifactId>
        <version>0.0.11</version>
    </dependency>

Добавьте @EnableFilesystemStores и @Import аннотации к SpringWebConfig:

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages =     
     {"spring.ahmed.mostafa.data","com.ahmed.mostafa.controllers"})
    @EnableFilesystemStores("com.ahmed.mostafa.controllers")
    @Import(org.springframework.content.rest.config.RestConfiguration.class)
    public class SpringWebConfig implements WebMvcConfigurer {    

и к следующим компонентам:

    @Bean
    File filesystemRoot() {
      try {
        return new File("/path/to/your/images/outside/webapp");
      } catch (IOException ioe) {}
      return null;
    }

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() {
      return new 
         FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }

Добавьте следующий магазин:

    @StoreRestResource(path="profilePics")
    public interface ProfilePicStore extends Store<String> {
    }

Теперь, когда вы запускаете приложениеу вас будет конечная точка REST, которая позволит вам сохранять и извлекать изображения профиля в /path/to/your/images/outside/webapp.Предполагается, что ваше веб-приложение работает на localhost:8080:

curl -X POST -F file=@/path/to/local/pic.jpg http://localhost:8080/<contextPath>/profilePics/profile1.jpg

Или:

<form:form action="${pageContext.request.contextPath}/profilePics/profile1.jpg" method="post" enctype="multipart/form-data">
    <input type ="file" name ="file">
    <input type ="submit" value ="submit">
</form:form>

сохранит файл в /path/to/your/images/outside/webapp/profile1.jpg.

И:

curl http://localhost:8080/<contextPath>/profilePics/profile1.jpg

Или:

<img src="${pageContext.request.contextPath}/profilePics/profile1.jpg">

восстановит его снова.Нет необходимости перезагрузки.

Поддерживаются различные магазины;файловая система, дБ, с3, gridfs.Просто замените зависимость spring-content-fs для одного магазина, который вы хотите использовать.

Spring Content также можно комбинировать с Spring Data, чтобы связать контент с сущностями.Я упоминаю, как будто вы, вероятно, храните пользователей в базе данных.Руководство по началу работы здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...