用户刚上传的Spring显示图像,无需重新启动服务器

时间:2018-06-02 12:21:42

标签: java spring spring-mvc

我试图创建一个允许用户上传他的个人资料图片的功能,然后他可以在发布或评论时显示它,我使用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;
}
}

是否可以上传并显示它而无需在root中重新启动 或者最好不要把它放在根路径中并在其他地方改变它, 以及如何让它以任何方式工作

谢谢!

1 个答案:

答案 0 :(得分:1)

试试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">

将再次检索它。无需重启。

支持各种不同的商店; filesystem,db,s3,gridfs。只需替换您要使用的一个商店的spring-content-fs依赖项。

Spring Content也可以与Spring Data结合使用,将内容与实体相关联。我提到,因为听起来你可能正在将用户存储在数据库中。有一个入门指南here